SE基本情報に出るIT用語

デッドロックとは?トランザクション同士がお互いに待ち状態になること

どうも!ひよこSE(@PiyoOct)です。

デッドロックって何?

デッドロックをひとことで言えば、「トランザクション同士がお互いに待ち状態になること」を意味します。

デッドロックを解消するには、いずれかのトランザクションをロールバックするか、強制終了させて、待ち状態を解消してあげる必要あり。

ちなみに実際に発生したら、だるいです。やるせない気持ちになるし、業務のシステム開発でやったら怒られる可能性がかなり高めの現象。

※強制終了したらデータがどうなるか、わからないから、何か言われるのは間違いないっす 汗

スポンサーリンク

デッドロックとは、トランザクション同士が待ち状態になること

デッドロックとは、トランザクション同士が待ち状態になることです。

その前に、前提知識として

について簡単に説明するので、もう知ってるよという人は飛ばしてください(-_-;)。

DB(データベース)とはデータを入れる入れ物

DB(データベース)とはデータを入れる入れ物のこと。

データベースとはデータを入れる入れ物のこと

データをポイっと投げて、保存するための入れ物や箱をイメージしてください。

学生番号なら、学生番号というデータをDBに保存する的なイメージです。

トランザクションとは1つのまとまった処理

トランザクションは、1つのまとまった処理のことです。

ゲームするときに例えるのがたぶんイメージしやすくて

  • 電源をつける
  • プレイする
  • 電源を切る

というまとまった処理を指します。

トランザクションとはまとまった処理

一連の動作としてまとまっているので、「処理を分けることはできない」(電源を付けただけじゃゲームしたことにならない)みたいに考えるのがいいかと。

データベースの世界で言えば、SQLを使うなりしてデータを入れ替えする一連の処理が、トランザクションです。

お互いのトランザクションの終了を待ち続ける

デッドロックは、 データを入れ替えする一連の処理であるトランザクションが2つ実行中のときに起きるお話です。

例えば、2人の兄弟がいたとして

  • お兄ちゃんが、弟の好きなゲームを横取り
  • 弟が、お兄ちゃんの好きなゲームを横取り

している状態をイメージしてください。

先にお兄ちゃんが、「弟のゲーム、つまんないし飽きたから、いつものゲーム・・・。あれ?弟が遊んでるじゃん。仕方ないなぁ。もう少し弟のゲームを続けて待ってるか。」と思ったとします。

でも実は、弟こそが「お兄ちゃんのゲーム、つまんないし飽きたから、いつものゲーム・・・。あれ?お兄ちゃんが遊んでるじゃん。仕方ないなぁ。もう少しお兄ちゃんのゲームを続けて待ってるか。」と思っていたとしたら。

すると、お互いがお互いを待っているので、いつまでもこの状態が続くことになります。

データを入れ替える途中のロックで起こる

トランザクション(データの入れ替え処理)の世界でも同じです。

  • Aというトランザクションがあったとして、データベースのテーブルXをロック
  • Bというトランザクションがあったとして、データベースのテーブルYをロック

この状態で、

  • トランザクションAが、テーブルXの次にテーブルY(Bがロック中)にアクセス
  • トランザクションBが、テーブルYの次にテーブルX(Aがロック中)にアクセス

したとすると。

テーブルX・Yともに、ロックがかかっている状態であり、お互いのトランザクションがロックの解除待ちになり、処理が進まなくなります。これが、デッドロックです。

スポンサーリンク

デッドロックの解消は、ロールバックかトランザクションの強制終了

デッドロックが発生したら、どうすればいいの?

デッドロックは、ロールバックか、トランザクションを強制終了すれば解消されます。

2つ実行中のトランザクションがあったとして、どちらか片方を

rollback;

でロールバックしてあげるか、

下記SQLでトランザクション(セッション)を強制終了させるしかありません。

①SELECT SID, SERIAL# FROM V$SESSION WHERE SID IN (SELECT SID FROM V$LOCK WHERE TYPE IN (‘TM’,’TX’));

②alter kill session ‘sid, serial#’; –‘sid, serial#’は、①で取得した番号

ロールバックを選択した場合は、もう片方のトランザクションも、コミット/ロールバックをしない限りは残り続けること。

強制終了させた場合は、2つのトランザクション実行前の整合性は保たれていないと思ってください。

まとめ

デッドロックときたら、「トランザクション同士がお互いに待ち状態であること」を意味します。

複数のトランザクションがデータの入れ替え処理のために、データベースのテーブルにロックをかけた結果、起こりえます。

デッドロックを解消するには、いずれかのトランザクションをロールバックするか、強制終了させて、待ち状態を解消してあげる必要あり。

データがおかしなことになってないかを確認する必要が出てくるし、対処もだるいので気を付けてくださいまし(-_-;)。

▼この記事がいいと思ったら、下の画像をクリックしてくれたら励みになります!

にほんブログ村 IT技術ブログ システムエンジニアへ
スポンサーリンク
ひよこSEのつぶやきブログ

コメント

タイトルとURLをコピーしました