|
|
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Ситуация с искусственной уникальностью в MSSQL. Есть таблица: document (doc_id int identity, doc_type int, doc_number int, department_id int, year int, ...). Номер документа (doc_number) должен быть уникален в пределах заданного отдела (department_id), данного типа (doc_type) и указанного года. Механизм - автоинкремент: максимум + 1. Т.е. добавление нового документа происходит так: create procdure CreateFirstTypeDocument @department_id int, @year int, ... какие-то параметры... as begin Declare @doc_nb int Begin Transaction -- Точка A Select @doc_nb = max (doc_number) + 1 From document Where department_id = @department_id and year = @year and doc_type = 1 if @doc_nb Is Null Select @doc_nb = 1 -- Точка B Insert document (doc_type, doc_number, department_id, year, ...) Values (1, @doc_nb, @department_id, @year, ...) -- Точка C ... Commit Transaction end В таблице одна запись, у которой doc_number = 1. Сервер сильно загружен. Процедуры выполняются медленно. Теперь из двух сессий одновременно вызывается CreateFirstTypeDocument. В точке B у для каждой сессии значение @doc_nb будет равно 2. Первая сессия добавляет запись нормально, а вторая своей вставкой нарушает уникальность номеров. Как обеспечить уникальность? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2002, 18:54:03 |
|
||
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
Может с утра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2002, 18:58:53 |
|
||
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
Да , я думаю с утра, а то пива много!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2002, 19:55:27 |
|
||
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
В селекте скажи WITH(HOLDLOCK,UPDLOCK). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2002, 20:07:46 |
|
||
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
Вам нужно использовать собственный механизм генераторов. Его реализовать совсем не сложно. Одна таблица, пара процедур. Смысл в том, что значение ключа получается из процедуры, которая автоматом увеличивает значение на 1... Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2002, 22:12:18 |
|
||
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
Дополню, Сергей Тихонов Запрос Код: plaintext 1. 2. 3. 4. 5. будет не к таблице document, а к аблице содержащей значение,последнее вставленное в document. Следующий вызов процедуры увеличит его на единицу и т.д. фрагмент кода нашей процедуры: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. @result обьявлен как output параметр ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2002, 08:48:28 |
|
||
|
Искусственная уникальность в MSSQL.
|
|||
|---|---|---|---|
|
#18+
Советую посмотреть здесь:\r /topic/12200\r Процедура и таблица, где хранятся счетчики - самый лучший вариант. Уникальность реализуется целиком и полностью (идет полная блокировка записи с максимальным номером, весь механизм генерации номеров завязан на одну процедуру и одну таблицу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2002, 10:55:21 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3418&tid=1820436]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 312ms |

| 0 / 0 |
