#locking #sql-server-2000
#блокировка #sql-server-2000
Вопрос:
Моя настройка — один сервер с двумя экземплярами SQL Server 2000, INSTANCE1 и INSTANCE2. Каждый экземпляр имеет 1 DB, DBprod и DBstag.
У меня ситуация, когда мне нужно подготовить счета для нескольких клиентов, поэтому я хотел бы установить эксклюзивную блокировку на таблицу, пока я извлекаю номер счета из INSTANCE1.DBprod.LastInvoiceNumber для INSTANCE2.DBstag, выполните вычисление soem, подготовьте счет-фактуру, а затем вставьте счет-фактуру (заголовок и подробную информацию) в INSTANCE1.DBprod, затем обновите INSTANCE1.DBprod.LastInvoiceNumber, повторите для следующего клиента, а затем снимите блокировку после того, как я закончу со всеми клиентами.
начать преобразование
ЭКСКЛЮЗИВНАЯ БЛОКИРОВКА INSTANCE1.DBprod.LastInvoiceNumber
открыть пользовательский курсор
следующая выборка от клиента
получить номер накладной из INSTANCE1.DBprod.LastInvoiceNumber
подготовить счет-фактуру
вставьте счет-фактуру в INSTANCE1.DBprod
обновить ИНСТАНС1.DBprod.LastInvoiceNumber (увеличить на 1)
следующая выборка от клиента (подготовка следующего счета клиента)
закрыть пользовательский курсор
зафиксируйте trans inv
СНИМИТЕ БЛОКИРОВКУ С экземпляра 1.DBprod.LastInvoiceNumber
Будет ли это моим решением
УСТАНОВИТЕ СЕРИАЛИЗУЕМЫЙ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ
Существует приложение учета, использующее INSTANCE1.DBprod.LastInvoiceNumber вот почему я хочу заблокировать таблицу исключительно до тех пор, пока не закончу разноску всех своих счетов.
Ответ №1:
Один из самых простых способов — использовать sp_getapplock, чтобы разрешить только один сеанс. Другие сеансы будут ждать / завершаться неудачей
Это не зависит от детализации блокировки и изоляции и часто лучше в этом сценарии. Использование SERIALIZABLE не является эксклюзивным: вам понадобится TABLOCKX. Но тогда другие средства чтения в таблице тоже блокируются
sp_getapplock будет применяться только к области действия этого кода.
Комментарии:
1. Я готовлю счета с помощью сохраненной процедуры. Я намерен заблокировать использование экземпляра всеми приложениями 1. DBprod. LastInvoiceNumber до тех пор, пока я не закончу разноску всех своих счетов… Я рассмотрю ваше предложение.