0

データベースに 2 つのテーブルがあります。それらはアイテムとフィールドです。Item は、ツリーを実装するための自己参照テーブルです。つまり、Item テーブルには、ID 列と ParentId 列があります。このようにして、Item テーブルにツリーを格納できます。フィールドは、アイテムの他の拡張プロパティを格納するテーブルです。フィールド テーブルには、アイテム テーブルを参照するための「Item_ID」という名前の列があります。

OK、今はデータベース操作にトランザクションを追加したいだけです。タイトルの通り、おかしな動作を発見しました。

Microsoft が要求したように、次の SQL を実行して、データベースのスナップショット分離を有効にします。

ALTER DATABASE AdventureWorks2008R2
SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE AdventureWorks2008R2
SET ALLOW_SNAPSHOT_ISOLATION ON;

そして、次のテストを行います:</p>

  1. 2 つのテスト プログラムを開く

  2. 最初のプログラムは項目 1 を更新し、トランザクションがコミットされる前にブロックされます。

  3. 2 番目のプログラムを使用して、アイテム 2 を削除しようとします。アイテム 1 はアイテム 2 と関係がありません。つまり、アイテム 1 はアイテム 2 の親/子ではありません。

  4. その後、2 番目のプログラムが最初のプログラムによってブロックされていることがわかりました。最初のプログラムを続行すると、タイムアウトでなければ 2 番目のプログラムが終了します。

この結果に違和感を覚えます。商品1が取引中でも商品2を削除できると思うので。なぜこれが起こるのか誰が知っていますか?

4

1 に答える 1

0

SNAPSHOT ISOLATION をまったく取得していないようです (更新/削除の衝突は失敗を引き起こし、最終的な完了ではないため)。

あなたは文字通り実行しませんでしたALTER DATABASE AdventureWorks2008R2...- そうですか?

「AdventureWorks2008R2」をデータベースの名前に置き換える必要があるため...

于 2013-07-17T00:39:21.323 に答える