Я использую базу данных Microsoft SQL Server 2005 с уровнем изоляции READ_COMMITTED
и READ_COMMITTED_SNAPSHOT=ON
.
Теперь я хочу использовать:
SELECT * FROM <tablename> FOR UPDATE
... так что другие соединения с базой данных блокируются при попытке доступа к одной и той же строке "ДЛЯ ОБНОВЛЕНИЯ".
Я пробовал:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
... но это блокирует все другие соединения даже для выбора идентификатора, отличного от "1".
Какой правильный намек сделать SELECT FOR UPDATE
, как известно для Oracle, DB2, MySql?
EDIT 2009-10-03:
Это инструкции для создания таблицы и индекса:
CREATE TABLE example ( Id BIGINT NOT NULL, TransactionId BIGINT,
Terminal BIGINT, Status SMALLINT );
ALTER TABLE example ADD CONSTRAINT index108 PRIMARY KEY ( Id )
CREATE INDEX I108_FkTerminal ON example ( Terminal )
CREATE INDEX I108_Key ON example ( TransactionId )
Многие параллельные процессы делают это SELECT
:
SELECT * FROM example o WITH (updlock) WHERE o.TransactionId = ?
EDIT 2009-10-05:
Для лучшего обзора я записал все проверенные решения в следующей таблице:
mechanism | SELECT on different row blocks | SELECT on same row blocks -----------------------+--------------------------------+-------------------------- ROWLOCK | no | no updlock, rowlock | yes | yes xlock,rowlock | yes | yes repeatableread | no | no DBCC TRACEON (1211,-1) | yes | yes rowlock,xlock,holdlock | yes | yes updlock,holdlock | yes | yes UPDLOCK,READPAST | no | no I'm looking for | no | yes