(Примечание: это для MS SQL Server)Условие состояния ранга SQL Server Вопрос
Скажите, что у вас есть таблица ABC с столбцом идентификации первичного ключа и столбец CODE. Мы хотим, чтобы каждая строка имела уникальный, последовательно сгенерированный код (на основе некоторой типичной формулы контрольной цифры).
Скажите, что у вас есть еще одна таблица DEF с одной строкой, в которой хранится следующий доступный код (представьте простой номер автонабора).
Я знаю, что логика, как показано ниже будет представлять состояние гонки, в которой два пользователи могут в конечном итоге с тем же кодом:
1) Run a select query to grab next available code from DEF
2) Insert said code into table ABC
3) Increment the value in DEF so it's not re-used.
Я знаю, что два пользователи могут застрять на стадии 1), и может в конечном итоге с тем же CODE в таблице ABC.
Каков наилучший способ справиться с этой ситуацией? Я думал, что могу просто включить «начать транс»/«совершить переход» вокруг этой логики, но я не думаю, что это сработало. Я имел хранимую процедуру, как это проверить, но я не избежать состояния гонки, когда я выбежала из двух различных окон в MS:
begin tran
declare @x int
select @x= nextcode FROM def
waitfor delay '00:00:15'
update def set nextcode = nextcode + 1
select @x
commit tran
Может кто-то пролить свет на это? Я думал, что транзакция не позволит другому пользователю получить доступ к моему NextCodeTable до тех пор, пока первая транзакция не завершится, но я полагаю, что мое понимание транзакций является ошибочным.
EDIT: Я попытался переместить ожидание после утверждения «update», и у меня есть два разных кода ... но я подозревал это. У меня есть команда waitfor, чтобы имитировать задержку, поэтому состояние гонки можно легко увидеть. Я думаю, что ключевой проблемой является неправильное понимание того, как работают транзакции.
Вы должны пересмотреть свой поздний ответ: принят один не правильно ... – gbn