2017-12-01 4 views
0

はこのテーブルと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分離を使用しません。

さらに最適なソリューションはありますか?

答えて

関連する問題