READ_COMMITTED
分離レベルがである Microsoft SQL Server 2005 データベースを使用していますREAD_COMMITTED_SNAPSHOT=ON
。
今私は使いたい:
SELECT * FROM <tablename> FOR UPDATE
...同じ行「FOR UPDATE」にアクセスしようとすると、他のデータベース接続がブロックされるようにします。
私は試した:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
...しかし、これにより、「1」以外の id を選択した場合でも、他のすべての接続がブロックされます。
SELECT FOR UPDATE
Oracle、DB2、MySql で知られていることを行うための正しいヒントはどれですか?
編集 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 = ?
編集 2009-10-05:
より良い概要のために、次の表に試したすべての解決策を書き留めました。
メカニズム | 異なる行ブロックに対する SELECT | 同じ行ブロックに対する SELECT -----------------------+-------------------------- ------+-------------------------- ローロック | いいえ | 番号 アップロック、ロウロック | はい | はい xlock、rowlock | はい | はい 反復可能な読み取り | いいえ | 番号 DBCC トレーソン (1211,-1) | はい | はい 行ロック、xlock、ホールドロック | はい | はい アップロック、ホールドロック | はい | はい UPDLOCK、READPAST | いいえ | 番号 探しています | いいえ | はい