|
вставка уникального значения.
|
|||
---|---|---|---|
#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 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
invm, Я там пытаюсь ваш код обсуждаю который вы прокоментировали 2 раза и как мне показалось эти разы протворечивы. Если делать как было паказано в 22056821 - в очередь встанут только добавлятели, ну и некоторые писатели, если будут модифицировать/удалять строку с максимальным NUM А в том посте 220... Код был такой Код: sql 1.
Из этого я понял, что читателям дана полная свобода. А это плохо. Но за тем вы пишите, что ваша строчка все же работает иначе: После выполнения этого запроса и до завершения транзакции, в других транзакциях невозможно будет прочитать, изменить, добавить или удалить ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 20:48 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
Сиквансы и идентити я выше говорил, что это не подходит. Я велосипед нагородил чтобы понять как работают транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 20:51 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
хм... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 20:55 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 Из этого я понял, что читателям дана полная свобода. А это плохо. В 22057563 написано максимально подробно каким именно читателям полная свобода, а каким нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 22:04 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 andron81, хотя вот оно определение монопольной блокировки: монопольная (exclusive) - означает, что только одна сессия может установить эту блокировку в один момент времени. ни о каких пользователях речи нет. А тут мы говорим о сессиях. andron81 invm, неа. мне показалось, что выше Вы писали иначе о том что будет происходить, если так расставить изоляцию Если указать tablockx, то будет заблокирована вся таблица дшля всех действий, кроме действий блокирующей сесии А если, как написал invm, указать (updlock, serializable), то будет заблокировано только получение нового ID, а вот чтение, изменение, и даже добавление предыдущих записей будет разрешено. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 22:20 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
alexeyvg А если, как написал invm, указать (updlock, serializable), то будет заблокировано только получение нового ID, а вот чтение, изменение, и даже добавление предыдущих записей будет разрешено. Да, вот это NUM >= @NUM, я профанарил. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 22:28 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
invm andron81, Не вижу разницы. "Добавлятель" - это ваш код и стартового поста. спасибо . в теории всё вроде бы понял. но стал экспериментировать и наткнулся на непонимание , что происходит. запустил 2 скрипта последовательно - скрипт1 и скрипт2. Скрипт1 с задержкой, Скрипт2 без. Оба пока без инсертов , первый как полагается отработал через 30 секунд. а второй крутится и крутится и крутится. скрипты прилагаю. Скрипт1 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Скрипт2 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 09:08 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 запустил 2 скрипта последовательно - скрипт1 и скрипт2. Скрипт1 с задержкой, Скрипт2 без. Оба пока без инсертов , первый как полагается отработал через 30 секунд. а второй крутится и крутится и крутится. скрипты прилагаю. Лучше и скрипт создания таблицы тоже приложите, включая все её объекты (индексы, констрейны и т.д.) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 09:20 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
alexeyvg andron81 запустил 2 скрипта последовательно - скрипт1 и скрипт2. Скрипт1 с задержкой, Скрипт2 без. Оба пока без инсертов , первый как полагается отработал через 30 секунд. а второй крутится и крутится и крутится. скрипты прилагаю. Лучше и скрипт создания таблицы тоже приложите, включая все её объекты (индексы, констрейны и т.д.) спасибо за участие. ну там таблица которую создал без всяких отсебяшных индексов. с одним только полем NUM которое я сделал первичным ключом. вот ещё могу что показать: картинка ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 09:23 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
да . сейчас попробовал на другой базе. всё работает - странно , а что это было ? а можно что-нибудь сказать по той картинке где результат выполнения sp_who2, sp_lock на тот висящий момент ? alexeyvg Лучше и скрипт создания таблицы тоже приложите, включая все её объекты (индексы, констрейны и т.д.) вот такой скрипт Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 09:39 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, Так не будет работать, не увеличиваете NUM, одно и то же вставляете, при добавлении в таблицу свалится на PRIMARY KEY Код: sql 1.
нужно Код: sql 1.
select top (1) @NEW_NUM = NUM from SPK_TEST13 with (updlock, serializable) order by NUM desc; ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 09:55 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 да . сейчас попробовал на другой базе. всё работает - странно , а что это было ? andron81 а можно что-нибудь сказать по той картинке где результат выполнения sp_who2, sp_lock на тот висящий момент ? В данном случае блокирующий SPID = 57, ищите это окошко. Можете в нём выполнить select @@trancount, он будет больше 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 10:00 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
entrypoint Так не будет работать, не увеличиваете NUM, одно и то же вставляете, при добавлении в таблицу свалится на PRIMARY KEY ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 10:00 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
alexeyvg andron81 а можно что-нибудь сказать по той картинке где результат выполнения sp_who2, sp_lock на тот висящий момент ? В данном случае блокирующий SPID = 57, ищите это окошко. Можете в нём выполнить select @@trancount, он будет больше 0. [/quot] справоцировать по новой это не удалось. странно всё это . вы пишите , что что-то блокирующее в сеансе с номером 57. Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command"). Вы хотите сказать , что транзакция до сих пор активна в этом сеансе ? а почему ? там ведь кроме моих сеансов и сеансов BuhServer/Администратор (причем не думаю , что ковыряния в базе msdb затрагивает нашу транзакцию из 57) ничего ведь нет . ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 12:17 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command"). 1. Открываем новое окошко SSMS 2. Выполняем команду begin tran 3. Смотрим состояние сессии ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 12:19 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
msLex andron81 Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command"). 1. Открываем новое окошко SSMS 2. Выполняем команду begin tran 3. Смотрим состояние сессии это ведь и было сделано и снимок sp_who2 есть. вот тут об этом я писал. 22057670 там и картинка с sp_who2 . вот и загадка в картинке : процесс 62 подвис из-за процесса 57. а 57 все как бы закончил (sleeping, Awaiting command). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 12:57 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 а 57 все как бы закончил (Awaiting command). В вашем 57, на начало выполнения скрипта, уже была открытая транзакция. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 13:02 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
invm В вашем 57, на начало выполнения скрипта, уже была открытая транзакция. вы хотите сказать ,что хоть я и запускал процесс 57 раньше 62, но в скрипте 62-го транзакция сработала раньше 57-го ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 13:17 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 вы хотите сказать ,что хоть я и запускал процесс 57 раньше 62, но в скрипте 62-го транзакция сработала раньше 57-го ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 13:27 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
invm andron81 вы хотите сказать ,что хоть я и запускал процесс 57 раньше 62, но в скрипте 62-го транзакция сработала раньше 57-го ? не понял. Получается в 57 транзакция не отработала ? Во всяком случае я в 57 в окно заходил скрипт отработал и выдал. можно предположить какая это транзакция (моя или чья-то ещё)? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 13:33 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81, единственное что я делал до этого это создавал таблицу SPK_TEST13 с одним полем(первичный ключ) по средствам менеджмент студио ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 13:44 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 Получается в 57 транзакция не отработала ? Получается, что в 57 просто есть незавершенная транзакция. Причин из-за чего может быть несколько. Например, прервали выполнение. Или выполнили только часть скрипта, без коммита. Или выполнение было прервано по ошибке. И т.п. Что бы снизить вероятность этого, рекомендуется включать опцию xact_abort. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 13:45 |
|
вставка уникального значения.
|
|||
---|---|---|---|
#18+
andron81 странно всё это . вы пишите , что что-то блокирующее в сеансе с номером 57. Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command"). Вы хотите сказать , что транзакция до сих пор активна в этом сеансе ? а почему ? Она выполнилась, и всё, сервер ждёт от вас следующих команд в этой сессии. А вы ушли обедать, ничего не делаете, окно не закрыли. Вот и будет открытая транзакция, заблокированные ресурсы, и статус Awaiting command. Пока вы не закроете коннект (окно в SSMS), либо не выполните COMMIT TRAN, либо пока кто то не кильнёт вашу сессию. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 14:26 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1686660]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 329ms |
total: | 494ms |
0 / 0 |