1. ホーム
  2. sql

[解決済み] SQL ServerでのSELECT FOR UPDATE

2023-06-03 18:13:22

質問

私は Microsoft SQL Server 2005 データベースを、分離レベル READ_COMMITTEDREAD_COMMITTED_SNAPSHOT=ON .

では、使いたい。

SELECT * FROM <tablename> FOR UPDATE

...そのため、他のデータベース接続が同じ行にアクセスしようとするとブロックされます "FOR UPDATE"。

試してみました。

SELECT * FROM <tablename> WITH (updlock) WHERE id=1

...しかし、これは "1" 以外の ID を選択した場合でも、他のすべての接続をブロックします。

を行うための正しいヒントはどれでしょうか? SELECT FOR UPDATE を行うための正しいヒントはどれですか?

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
-----------------------+--------------------------------+--------------------------
ROWLOCK|いいえ|いいえ
アップロック、ローロック|はい|はい
xlock,rowlock(ロック、ロウロック)| yes(はい)| yes(はい
repeatableread|no|no
DBCC TRACEON (1211,-1) | yes | yes
ローロック、エクスロック、ホールドロック
アップロック、ホールドロック
UPDLOCK,READPAST|no|no

探しています|いいえ|はい

どのように解決するのですか?

最近、私は デッドロック問題 が発生しました。Sql Server が必要以上にロックするためです (ページ)。これに対して本当に何もすることができません。今、私たちはデッドロック例外をキャッチしています...そして、私は代わりにOracleを持っていたかったです。

編集中です。 私たちは一方でスナップショット分離を使用しています。残念ながら、スナップショット分離を使用するためには、データベース サーバーによって許可される必要があります。現在ではデッドロック例外(もちろんまだ起こり得ます)だけでなく、バックグラウンド・プロセスからトランザクションを繰り返すスナップショット並行性問題(これはユーザが繰り返すことはできません)も発生しています。しかし、これはまだ以前よりはるかに良いパフォーマンスです。