SQL Server 2000 Эксклюзивная блокировка - PullRequest
0 голосов
/ 15 апреля 2011

Моя настройка - один сервер с двумя экземплярами SQL Server 2000, INSTANCE1 и INSTANCE2.Каждый экземпляр имеет 1 DB, DBprod и DBstag.

У меня есть ситуация, когда мне нужно подготовить счета для нескольких клиентов, поэтому я хотел бы установить эксклюзивную блокировку для таблицы, пока я получаю номер счета из INSTANCE1.DBprod.LastInvoiceNumber для INSTANCE2.DBstag, выполнить расчет соема, подготовить счет-фактуру, а затем вставить счет-фактуру (заголовок и подробности) в INSTANCE1.DBprod, затем обновить INSTANCE1.DBprod.LastInvoiceNumber, повторить для следующего клиента и затем снять блокировку после IЯ закончил со всеми клиентами.

begin trans inv

ИСКЛЮЧИТЕЛЬНО БЛОКИРОВКА INSTANCE1.DBprod.LastInvoiceNumber

открыть курсор клиента

получить следующий изклиент

получает номер счета из INSTANCE1.DBprod.LastInvoiceNumber

подготовить счет

вставить счет в INSTANCE1.DBprod

обновить INSTANCE1.DBprod.LastInvoiceNumber (инкрементпо 1)

получить следующий от клиента (подготовить следующий счет клиента)

закрыть курсор клиента

commit trans inv

RELEASE LOCK ON INSTANCE1.DBprod.LastInvoiceNumber

Было бы это моим решением

УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СЕРТИФИКАЦИИ

Существует учетное приложение, использующее INSTANCE1.DBprod.LastInvoiceNumber, поэтому я хочу заблокировать таблицу исключительно до тех пор, пока не закончу публиковать все свои счета.

1 Ответ

0 голосов
/ 15 апреля 2011

Один из самых простых способов - использовать sp_getapplock , чтобы разрешить только один сеанс.Другие сеансы будут ожидать / терпеть неудачу

Это не зависит от степени детализации и изоляции блокировки, и в этом случае часто лучшеИспользование SERIALIZABLE не является эксклюзивным: вам понадобится TABLOCKX.Но тогда другие читатели на столе тоже заблокированы

sp_getapplock будет применяться только к области действия этого кода.

...