分離レベルのT1 と T2 の 2 つのトランザクションがSERIALIZABLE
あります (デフォルトの分離レベルだと思いますREAD COMMITTED
が、問題ではありません)。
トランザクション T1 はSELECT
、次にWAITFOR
2 秒、次にを実行しSELECT
ます。
トランザクション T2 はUPDATE
、T1 が読み取ったデータに対して実行されます。
デッドロックが発生します。トランザクション T2 が T1 の終了を待たないのはなぜですか?
T1 にREPEATABLE READ
分離レベルがある場合、すべて問題ありません。つまり、幻の行が発生します。SERIALIZABLE
分離レベルを まで上げると、T2 は T1 の終了を待つと思いました。
これは私の大学の演習の一部です。分離レベルが正しくなく、分離レベルが正しくてもこれらの影響がない 2 つの並列トランザクションで負の影響を示す必要があります。
コードは次のとおりです。残念ながら、フィールドの名前はポーランド語です。
T1:
MRを使用してください。 IMPLICIT_TRANSACTIONS をオフに設定します。 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 取引を開始します。 -- 1. ザピタニエ 選択する www.IdSamochodu、s.Model、s.Marka、s.NrRejestracyjny、o.PESEL、o.Nazwisko、o.Imie、o.NrTelefonu から WizytyWWarsztacie www 加入 サモチの ON s.IdSamochodu = www.IdSamochodu 加入 おそびを ON o.PESEL = s.PESEL どこ www.[ステータス] = 'gotowy_do_odbioru' ORDER BY www.IdSamochodu ASC ; WAITFOR DELAY '00:00:02'; -- 2. ザピタニエ 選択する u.IdSamochodu、tu.Nazwa、tu.Opis、u.Oplata から うするぎう 加入 TypeyUslug tu ON tu.IdTypuUslugi = u.IdTypuUslugi 加入 WizytyWWarsztacie www ON www.IdSamochodu = u.IdSamochodu AND www.DataOd = u.DataOd どこ www.[ステータス] = 'gotowy_do_odbioru' ORDER BY u.IdSamochodu ASC, u.Oplata DESC ; 専念;
T2:
MRを使用してください。 IMPLICIT_TRANSACTIONS をオフに設定します。 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 取引を開始します。 アップデート ウスルギ 設定 [ステータス] = 'wykonano' どこ IdUslugi = 2 ; アップデート www 設定 www.[ステータス] = 'gotowy_do_odbioru' から WizytyWWarsztacie www どこ www.[ステータス] = 'wykonywanie_usług' AND 存在する ( 選択 1 から うするぎう どこ u.IdSamochodu = www.IdSamochodu AND u.DataOd = www.DataOd AND u.[ステータス] = 'wykonano' GROUP BY u.IdSamochodu、u.DataOd HAVING COUNT(u.IdUslugi) = ( 選択する COUNT(u2.IdUslugi) から ウスルギu2 どこ u2.IdSamochodu = www.IdSamochodu AND u2.DataOd = www.DataOd GROUP BY u2.IdSamochodu、u2.DataOd ) ) ; 専念;
私は SQL Management Studio を使用しており、各トランザクションを異なるファイルに保存しています。T1 で F5 をクリックしてこれを実行し、T2 を含むファイルにすばやく切り替えて、もう一度 F5 を実行します。
mssql のデッドロックとロック メカニズムについて読みましたが、どうやら、このトピックをまだ理解していないようです。
SQL Server 2008 R2 (.Net 2.0 アプリケーション) でのデッドロックの問題
選択/更新または複数の選択の間で SQL Server がデッドロックする
http://msdn.microsoft.com/en-us/library/ms173763(v=sql.105).aspx
http://www.sql-server-performance.com/2004/advanced-sql-locking/
編集
T2 の最初の UPDATE ステートメントが問題の原因であることがわかりました。なぜですか?