2016-11-15 4 views
1

В моем приложении несколько пользователей имеют возможность читать или изменять одни и те же таблицы. Однако, когда одна строка изменяется пользователем, другие не должны ее использовать больше.SQL Server 2008 - как повысить ошибку при попытке обновить заблокированную строку?

Использование с ISOLATION LEVEL READ UNCOMMITED. Проблема заключается в том, что когда пользователь обновляет строку в таблице, а другой пользователь пытается обновить ту же строку - вторая транзакция будет ждать первой транзакции до ROLLBACK/COMMIT, прежде чем она сможет обновить строку.

Что я хочу сделать, так это поднять ошибку в этой ситуации, для второго пользователя - , поэтому ему не нужно так долго ждать.

Как это сделать?

Проблема заключается в том, что транзакции достаточно велики (несколько процедур включены), поэтому существует возможность блокировать некоторых пользователей в течение некоторого времени из-за блокировки.

Спасибо

+0

'READPAST',' sp_getapplock' или ручные логические блокировки. –

+0

спасибо @Ivan за редактирование и комментарий :) – VictorT

ответ

0

Вы можете быть в состоянии использовать NOWAIT подсказку, когда второй пользователь пытается его запрос от своей собственной сделки:

пользователя один

BEGIN TRAN 
SELECT * 
FROM someTable 
WHERE blah 

Пользователь два

(first user's transaction still open) 
BEGIN TRAN 
SELECT * 
FROM someTable WITH(NOWAIT) 
WHERE blah 

Я помню, где-то читал, что только поддержка Oracle и Postgres не позволяет быстро блокировать покупки. Если это так, то вышеупомянутый намек может быть проигнорирован.

+1

, что здорово - спасибо; Эти TabelHints также работают для сообщений UPDATE, INSERT и DELETE. Так что это решило мою проблему! – VictorT