Дано: MS SQL Server 2014.
Цель эксперимента: выяснить реакцию sql-сервера на попытку одновременного доступа на редактирование записи от конкурентных запросов без использования транзакций.
Эксперимент проводился в связи со следующей задачей: есть таблица ваучеров на доступ к сети WiFi. Эти ваучеры выдаются определенным людям по запросу (с предъявлением документа, удостоверяющего личность). Оператор (сотрудник, непосредственно выдающий ваучеры на руки) делает запрос к базе через веб-приложение на выдачу ваучера. Информация о самом ваучере и о том, что он выдан находится в одной таблице. Данный запрос реализуется при помощи следующего алгоритма, состоящего из 2х этапов:
1) SELECT-запрос - запрос на наличие свободного ваучера и получения его идентификатора (ID):
2) UPDATE-запрос - обновление информации о ваучере (указание, что он выдан и когда выдан на базе полученного в предыдущем запросе идентификатора).
Проблема: если два оператора одновременно сделают подобный запрос на выдачу ваучера, то может случиться такое, что пока не выполнен UPDATE-запрос ваучер остается условно свободным и может быть случайно выдан два раза (см. эксперимент 1).
Цель эксперимента: выяснить реакцию sql-сервера на попытку одновременного доступа на редактирование записи от конкурентных запросов без использования транзакций.
Эксперимент проводился в связи со следующей задачей: есть таблица ваучеров на доступ к сети WiFi. Эти ваучеры выдаются определенным людям по запросу (с предъявлением документа, удостоверяющего личность). Оператор (сотрудник, непосредственно выдающий ваучеры на руки) делает запрос к базе через веб-приложение на выдачу ваучера. Информация о самом ваучере и о том, что он выдан находится в одной таблице. Данный запрос реализуется при помощи следующего алгоритма, состоящего из 2х этапов:
1) SELECT-запрос - запрос на наличие свободного ваучера и получения его идентификатора (ID):
SELECT TOP 1 intID FROM tblVouchers WHERE blnIsGiven = 0
2) UPDATE-запрос - обновление информации о ваучере (указание, что он выдан и когда выдан на базе полученного в предыдущем запросе идентификатора).
UPDATE tblVouchers SET blnIsGiven = 1, dtGivenDate = GetDate() WHERE intID = @IntID
Проблема: если два оператора одновременно сделают подобный запрос на выдачу ваучера, то может случиться такое, что пока не выполнен UPDATE-запрос ваучер остается условно свободным и может быть случайно выдан два раза (см. эксперимент 1).