トランザクション処理とは?共有ロック、専有ロック、デッドロックの違いについてまとめました。
【はじめに】共有ロック、専有ロック、デッドロックの違い
システムにおける、永続的なデータに対する不可分な一連の処理です。
つまり、複数の処理を1つにまとめたもので、これら「複数の処理」は分離させることができません。
用語 | 概要 |
---|---|
共有ロック | データを読込むときに使うロックで、資源がこの状態の場合は他のトランザクションによる更新処理ができなくなる。(読込みは可能) |
専有ロック | データを更新するときに使うロックで、資源がこの状態の場合は他のトランザクションによる読込みや更新ができなくなる。 |
デッドロック | トランザクションは永遠に待ち状態になってしまう状態。処理の続行ができなくなってしまいまうので、DBMSが両方のトランザクションをアボート(中止)し、ロールバックします。 |
【例題】平成17年春期 問67
三つのトランザクションT1,T2,T3が①~⑪の順序でデータa,bに対する処理を行った場合にデッドロックとなるのはどの時点か。ここで、DBMSはREADの直前に共有ロック,UPDATEの直前に占有ロックをかけ,ROLLBACK又はCOMMITですべてのロックを解除するものとする。
【解答】
以下の順で処理が進むため、正解は⑦となります。
①T1が a を共有ロックする。
②T2が b を占有ロックする。
③T2がROLLBACKで b の占有ロックを解除する。
④T1が b を共有ロックする。
⑤T3が b を共有ロックする。
(bは共有ロックのため別トランザクションからの読込みが可能)
⑥T3が待ち状態となる。(更新処理のため占有ロックをaにかけようとするが、T1がaを共有ロック中のため)
⑦T1が待ち状態となる。(更新処理のため占有ロックをbにかけようとするが、T3が b を共有ロック中のため)
⑦でT1はT3読込み中のbを、T3はT1読込み中のaが解放されるのを互いに待つ状態になり、2つのトランザクションの間でデッドロックが発生します。
コメント