私のデータベースには2つのテーブルがあります。アイテムとフィールドです。 アイテムは、ツリーを実装するための自己参照テーブルです。これはItemテーブルでIDとParentIdカラムがあることを意味します。このようにして、Itemテーブルにツリーを格納することができます。 フィールドは、アイテムの他の拡張プロパティを格納するためのテーブルです。フィールドテーブルには、アイテムテーブルを参照する "Item_ID"という名前の列があります。スナップショット分離SQL Serverデータベースでトランザクションブロック削除操作を更新するのはなぜですか?
これで、トランザクションをデータベース操作に追加したいだけです。私たちはタイトルとしていくつかの奇妙な行動を見つけました。
Microsoftは私達が私達のデータベースのスナップショットアイソレーションを有効にするには、次のSQLを実行して、尋ねたよう:
ALTER DATABASE AdventureWorks2008R2
SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE AdventureWorks2008R2
SET ALLOW_SNAPSHOT_ISOLATION ON;
そして、我々は次のテストを実行します。
オープン2テストプログラム
を
最初のプログラムはアイテム1を更新し、トランザクションがコミットされる前にブロックされます。
項2項1に
2.その後、我々が第二見つかった項目の親/子である項目1がないことを意味項目2.とは関係の船を持っていない削除しようとするために、第2のプログラムを使用しますプログラムは最初のプログラムによってブロックされます。最初のプログラムを続けると、タイムアウトでなければ2番目のプログラムが終了します。
私はこの結果が奇妙に感じます。私はアイテム1でもトランザクション中であってもアイテム2を削除できると思うので。これがなぜ起こるのか誰が知っていますか?
実際には2つのレコードの間には直接的な関係が存在しない場合、データベース・サーバは、テーブルのロックではなく行ロックを実行しているように、それが聞こえます。 – gorjusborg
@ YuRDeD、あなたは正しいと思います。親子関係のため(私はSQL Serverのロック戦略の内部を知らないと認めます)、テーブルレベルのロックを行う必要があると思われます。 –
@Pleepleusはい、私もそうだと思います。しかし、私はそれをする必要はないと感じています。そして私は解決策があるかどうかを知りたい。 – Coofucoo