はこのテーブルと2つの同時クエリを検討競合しないだろう挿入ロック回避:SQLシリアライズが、
create table BLARG (a int not null unique);
接続#1:
set transaction isolation level snapshot;
begin transaction;
if exists (select 1 from BLARG with (serializable) where a=1) print 'DIE!';
接続#2:
set transaction isolation level snapshot;
begin transaction;
insert into BLARG values (2); -- Blocked!
を
なぜa = を挿入すると、 r a = ?
スナップショットアイソレーションでは、テーブルへの挿入を防止する別の方法がありますか?
...場合
I overgeneralizedか正確に正しい質問をしておりません、ここで私の(やや少ない一般化が、まだ一般化)シナリオだしました:
テーブル[部品]と[完了]各パーツには "Txid"列があります
任意のTxidの場合、[Parts]の挿入は、[Parts]挿入トリガーによって[Completion]レコードが作成されるまで実行できますTxid = ...)がスローされたところで完了しました。 [完了]を挿入
は、[部品]テーブルが要約されることを引き起こし、その結果はすべての取引は2つの取引を開始した場合、その1は、[完了]を挿入しスナップショット分離に
を始めるどこか
を行って、 1つが[Parts]に挿入されると、書込みスキューは、[Completed]トリガーが同時トランザクションで発生した[Parts]に挿入されないようにします。
しかし、[Completed]は非常に混雑しているテーブルであり、一致するTxidを持つ挿入に問題がある場合は、すべての挿入を防止するためにSerializable分離を使用しません。
さらに最適なソリューションはありますか?