SQL Server 2005 - есть ли способ заблокировать SELECT в транзакции? - PullRequest
2 голосов
/ 30 апреля 2009

Есть ли способ заблокировать SELECT в транзакции? Если происходит SELECT, больше SELECT не выполняется, пока первый не завершен.

Спасибо!

Ответы [ 5 ]

2 голосов
/ 30 апреля 2009

Не уверен, что я правильно понимаю ваш вопрос, но если вы хотите наложить более строгую блокировку, чем стандартная SQL Server, то вы можете либо повысить уровень изоляции, либо использовать подсказку о блокировке. Это может быть полезно, если вам сначала нужно что-то выбрать, а затем, основываясь на значении SELECT, сделать ОБНОВЛЕНИЕ. Чтобы избежать фантомного ОБНОВЛЕНИЯ от другой транзакции (в которой ранее выбранное значение было изменено в ч / б SELECT и UPDATE), вы можете установить блокировку обновления для оператора SELECT.

Например:

 select * from mytable with (holdlock, xlock)

Обратите внимание, что вышеприведенный оператор SELECT использует более строгую блокировку обновления и удерживает эту блокировку на протяжении транзакции. Вы также хотели бы заключить свои заявления в явную транзакцию, например:

begin transaction
select * from mytable with (holdlock, xlock) -- exclusive lock held for the entire transaction
-- more code here...
update mytable set col='whatever' where ...
commit transaction

Будьте осторожны, конечно, для длительных транзакций.

2 голосов
/ 30 апреля 2009

Возможно, стоит взглянуть на Уровень изоляции вместо подсказки

0 голосов
/ 30 апреля 2009

Изменение уровня изоляции - ваш лучший выбор.

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

select * from MyTable with (tablockx)

Это предотвратит любые другие операции выбора в таблице до завершения транзакции.

0 голосов
/ 30 апреля 2009

похоже, вы ищете пессимистичную стратегию блокировки, но без фактической блокировки ваших данных. посмотрите на блокировки приложений на сервере sql.

0 голосов
/ 30 апреля 2009

Вам понадобится уровень изоляции SERIALIZABLE:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Другие SELECT запросы будут блокироваться до завершения транзакции в этом случае. Уровень по умолчанию обычно READ COMMITTED.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...