Эксклюзивная блокировка SQL Server 2000

#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 до тех пор, пока я не закончу разноску всех своих счетов… Я рассмотрю ваше предложение.