0

一時的な高負荷 (約 10 秒) によってデッドロックが繰り返されるため、データベースの分離レベルを READ_COMMITED から READ_COMMITED_SNAPSHOT に変更したいと考えました。

私はそれについてできる限り多くのことを読み込もうとしましたが、絶対に確信が持てないことが 1 つあります。データを挿入し、挿入された行の ID を読み取るトリガーにどのように影響するのでしょうか?

ここには 2 つの可能性があり (より低い ID を持つ行が存在すると仮定)、それらの 2 つの行が別のトリガー内にあると仮定します。

1)

Insert into table (ID) value (3);
Select Top 1 ID from table order by ID desc;

2)

Insert into table (ID) value (3);
Select SCOPE_IDENTITY();

理論上は問題ないはずですが、確認をお願いします。ありがとう

4

1 に答える 1

2

Scope_Identity()またはOUTPUT句を使用して、新しい行に割り当てられた ID を取得します。それらは、SELECT が許可する競合状態に悩まされることはありません。分離レベルが問題になることはありません。

OUTPUTさまざまな理由から、ツールのバッグに入れておくと便利です。INSERTDELETEUPDATEおよびMERGEステートメントで機能します。1 行に限定されません。ID値だけでなく、複数の列をキャプチャできます。

@@IDENTITYダークサイドから値を取得するため、使用しないでください。(予測できない値のソースが必要な場合を除きます。) IDENT_CURRENT()また、ほとんど役に立ちません。

于 2013-05-29T16:29:25.393 に答える