Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 О "неявных" Транзакциях  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
В системе определенно кривовато организована генерация первичных ключей. делаются они не с помощью идентити. А с помощью спец таблицы где хранятся значения. Вот тут обнаружили что наконец то стали появляться одинаковые значения при генерации (что в принципе и не удивительно)

Есть строчка, выполняется из Си-Шарпа. Самостоятельно никаких транзакций не открывается

"update Seq set LastValue = LastValue + 1 where SeqName = '{0}'\n" +
"if @@ROWCOUNT = 0\n" +
" insert into Seq (SeqName, LastValue) VALUES ('{0}', 1)\n" +
"select isnull(max(LastValue), -1) from Seq where SeqName = '{0}'"

Вопрос такой.

Открывается ли самим SQL Server-ом Транзакция на выполнение этого блока команд?
Если открывается то закрывается после выполнения всего блока или только апдейта?

Судя по тому, что одинаковые значения появляются при параллельной работе с нескольких мест. Никаких транзакций сервер самопроизвольно не открывает. Иначе бы параллельное выполнение этого скрипта с двух машин все равно бы дало разное значение Max(Value)

Может ли Вообще SQL Server самостоятельно открывать транзакции если его об этом не просят.
14 июн 12, 16:03    [12714605]     Ответить | Цитировать Сообщить модератору
 Re: О "неявных" Транзакциях  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Даже неявно открытые транзакции комитить или откатывать надо явно.

DKey
Иначе бы параллельное выполнение этого скрипта с двух машин все равно бы дало разное значение Max(Value)
С какого перепугу?
14 июн 12, 16:05    [12714627]     Ответить | Цитировать Сообщить модератору
 Re: О "неявных" Транзакциях  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Если версия сервера позволяет, то вся эта конструкция заменяется одним MERGE.
14 июн 12, 16:30    [12714825]     Ответить | Цитировать Сообщить модератору
 Re: О "неявных" Транзакциях  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Открывается ли самим SQL Server-ом Транзакция на выполнение этого блока команд?


На "блок команд" в режиме неявных - нет. Каждая инструкция - отдельная транзакция. И для приведенного кода даже явное открытие\фиксация транзакции не поможет. Нужен подъем TIL до SERIALIZABLE.
14 июн 12, 16:32    [12714848]     Ответить | Цитировать Сообщить модератору
 Re: О "неявных" Транзакциях  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DKey
наконец то стали появляться одинаковые значения при генерации
А разве уникальный индекс по полю PK не создан?
Или Вы как раз по сообщениям сервера поняли про дубли?

Может быть, просто молча сразу же повторять попытку вставить запись ещё раз, пока она не пройдёт?
Иначе нужна монопольная блокировка на чтение таблицы
(чтобы MAX() никто посчитать не мог до закрытия текущей транзакции),
а это же ещё хуже?
14 июн 12, 16:42    [12714942]     Ответить | Цитировать Сообщить модератору
 Re: О "неявных" Транзакциях  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
iap
DKey
наконец то стали появляться одинаковые значения при генерации
А разве уникальный индекс по полю PK не создан?
Или Вы как раз по сообщениям сервера поняли про дубли?

Может быть, просто молча сразу же повторять попытку вставить запись ещё раз, пока она не пройдёт?
Иначе нужна монопольная блокировка на чтение таблицы
(чтобы MAX() никто посчитать не мог до закрытия текущей транзакции),
а это же ещё хуже?


Там очень хитрые товарищи были и составной ключ по ID и Parent_ID и все отлично работало пока. не появились клиенты у которых система активно работает на нескольких машинах и уведомления о получении у которых Parent_ID не -1
В результате ДО того. Два клиента редко сохраняли документы одновременно секунда в секунду (по сути никогда) и все работало.
Теперь же когда некоторые документы создаются автоматически - у одного ПОКА у одного полезли такие глюки.
Ну а о ошибке узнали когда эти документы попытались отправиться на принимающий сервер, который их и послал далеко по причине нарушения PK.

Вообщем система работала ПЯТЬ лет на более чем сотне клиентов. Как работала :-) Видимо силой господней и постоянным ручным подкручиванием скриптами. Причем четко видно по стилю - писали гении ООП, но с базой они обошлись непочеловечески :-( Видимо не любили они СУБД
14 июн 12, 18:36    [12715798]     Ответить | Цитировать Сообщить модератору
 Re: О "неявных" Транзакциях  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
А так видимо действительно придется блокировку на чтение сажать. либо самостоятельно открывать транзакцию с блокировкой на запись. тогда при наличии первого Апдейта, второй из другой сессии подвиснет до коммита транзакции с первым и притормозит селект который идет после него . Таким образом сначала пройдет апдейт-селект первой сессии а потом уже апдейт-селект второй.
14 июн 12, 18:41    [12715819]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить