|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
Есть таблица с одним единственным числовым полем (NUM), это поле первичный ключ. для неё делаю Код: sql 1. 2.
Задача такая : хочу вставить туда строчку со значением поля равного max(NUM) +1 . Как всегда начнете пинать, да и ладно , но где я не дочитал по транзакциям ??? сначала на одном сеансе запускаю : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
потом на 10 - ти других сеансах последовательно запускаю тоже самое , но без задержки WAITFOR DELAY '00:00:30'; Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
в результате на одном из сеансов инсерт отвалился, а почему ? :-( Сообщение 2627, уровень 14, состояние 1, строка 11 Нарушение "PK_SPK_TEST13" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo.SPK_TEST13". Повторяющееся значение ключа: (3). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 15:42 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 15:47 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
Для этого придумали:
... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 15:48 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Для этого придумали:
идентити это понятно. мне для понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 15:49 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 Гавриленко Сергей Алексеевич Для этого придумали:
идентити это понятно. мне для понимания. что имеется ввиду ? sequence ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:03 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 andron81 пропущено... идентити это понятно. мне для понимания. что имеется ввиду ? sequence понятно, вы переоцениваете версию MS SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:06 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
спасибо , осталось понять вот это : Shakill with (tablockx, holdlock) [/src] ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:08 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Для этого придумали:
Я так понял человек озабочен отсутствием дырок в последовательности, чего IDENTITY и SEQUENCE не гарантируют. А если при Readcommitted делать merge запроса (SELECT max(NUM)+1 AS NEW_NUM FROM SPK_TEST13) на целевую таблицу? Этого не будет достаточно? Или будут дедлоки или дубли? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:17 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 спасибо , осталось понять вот это : Shakill with (tablockx, holdlock) Код: sql 1.
они получают одинаковое значение. Ведь читать можно одновременно, по умолчанию это разрешено. И это естественно, иначе бы сервер, грубо говоря, одновременно работал бы только с одним коннектом. Хинт tablockx указывает, что нужно наложить на таблицу монопольную блокировку, и тогда первая транзакция будет держать таблицу, пока не закроет транзакцию, и остальные будут ждать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:18 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, автор где я не дочитал по транзакциям Не дочитали раздел об уровне изоляции транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:33 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
alexeyvg Хинт tablockx указывает, что нужно наложить на таблицу монопольную блокировку, и тогда первая транзакция будет держать таблицу, пока не закроет транзакцию, и остальные будут ждать. точно, эксклюзивные блокировки и так держатся до конца транзакции. holdlock не нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:33 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
a_voronin Я так понял человек озабочен отсутствием дырок в последовательности, чего IDENTITY и SEQUENCE не гарантируют. А если при Readcommitted делать merge запроса (SELECT max(NUM)+1 AS NEW_NUM FROM SPK_TEST13) на целевую таблицу? Этого не он прав идентити вполне пригоден для моей задачи. я забыл оговорить , что я его использовать не хочу. мне для понимания транзакции , поэтому я изобретаю этот велосипед. Поиском "несуществующих" id - шек в таблице с дальнейшем их инсертом задача не стоит, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:40 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, ну в смысле поиском дыр я не озабочен. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 16:41 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, создаем объекты и наполняем данными Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Для WAITFOR TIME 'Здесь указать время' указываем ближайшее время в будущем, для того что бы два одинаковых скрипта в разных окнах запросов (сессиях) запустились одновременно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
1. Создаем новый запрос, копируем туда выше приведённый скрипт с указанным временем WAITFOR TIME, запускаем 2. Создаем новый запрос, копируем туда выше приведённый скрипт с указанным временем WAITFOR TIME, запускаем ... ... ... ... n. Ждем, когда настанет время старта, указанное Вами в WAITFOR TIME, и получаем результат Это - потом Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 19:21 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
entrypoint, Все это делается через sp_getapplock или tablockx. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 19:26 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
Shakill точно, эксклюзивные блокировки и так держатся до конца транзакции. holdlock не нужен Чтобы всех желающих выстроить в очередь достаточно Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 20:11 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
alexeyvg Хинт tablockx указывает, что нужно наложить на таблицу монопольную блокировку, и тогда первая транзакция будет держать таблицу, пока не закроет транзакцию, и остальные будут ждать. ок. тогда такой вопрос )) всё это описано, конечно, в уровнях изоляции , но я тупой. нужен разжованный трамплин , а дальше уже буду читать сам умное чтиво. запускаю в первом сеансе (*) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
не дожидаясь выполнения запускаю последовательно скрипт N раз в разных сеансах (в разных запросах менеджмент студио, но под одним пользователем): Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Но речь идет о монопольности. верно ли я понимаю, что раз я запускаю под одним пользователем , то возможны неприятности в виде : "Нарушение "PK_SPK_TEST13" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo.SPK_TEST13". Повторяющееся значение ключа: (3)." Ведь в рамках одного пользователя можно читать таблицу из других транзакций. Или я неверно понимаю понятие монопольности ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 15:11 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, хотя вот оно определение монопольной блокировки: монопольная (exclusive) - означает, что только одна сессия может установить эту блокировку в один момент времени. ни о каких пользователях речи нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 15:17 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, да, если один пользователь установит три сессии, то выполняться запрос будет только в одной, остальные сессии будут ожидать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 16:16 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, Монопольной блокировкой вы выстроите в очередь всех - и читателей, и писателей, и добавлятелей. Если делать как было паказано в 22056821 - в очередь встанут только добавлятели, ну и некоторые писатели, если будут модифицировать/удалять строку с максимальным NUM. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 18:05 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
invm select top (1) NUM + 1 from SPK_TEST13 with (updlock, serializable) order by NUM desc; invm в очередь встанут только добавлятели, ну и некоторые писатели, если будут модифицировать/удалять строку с максимальным NUM. а читателям карт бланш во всех транзах одновременно ? дно мне ведь и читать нельзя тут в других транзах , если эта транза не активная на данный момент. иначе вот выполняется первая транзакция . прочитается в ней скажем max(NUM)=5 и во второй тоже max(NUM)=5 прочитается(читателям ведь можно), а потом когда придет время выполнения записи во второй транзакции , а NUM=5 уже записан. и вот вторая транзакция и отвалится. или я неверно Вас понял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 19:27 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, Код: sql 1. 2.
После выполнения этого запроса и до завершения транзакции, в других транзакциях невозможно будет прочитать, изменить, добавить или удалить те строки SPK_TEST13, где NUM >= @NUM Это справедливо и для пустой таблицы. В этом случае можно считать, что в @NUM минус бесконечность. Так понятнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 19:57 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
invm, неа. мне показалось, что выше Вы писали иначе о том что будет происходить, если так расставить изоляцию ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 20:15 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, Не вижу разницы. "Добавлятель" - это ваш код и стартового поста. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 20:30 |
|
|
start [/forum/topic.php?fid=46&msg=39912503&tid=1686660]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 19ms |
total: | 158ms |
0 / 0 |