皆さん、こんばんはカズヤんです。
今日は、プレミアムフライデーですね笑
僕は、安定の仕事充ですがww
今日は、データベースのデッドロックについて書きます。
というのも、今日も昼過ぎに障害通知来て対応していました。そのエラーがデッドロックに関するエラーだったわけです。それで2時間拘束されましたね。ただ、既知のエラーだったので、すぐ対応できたのが救いでしたね。既知のエラーの対象なのはユーザーをこちらが把握している場合です。もしこれが、把握していないユーザ(つまり、お客様の会社のユーザ)の場合は、問題管理プロセスのワークフローを回して、新たに原因を調べないといけないので死ぬほど面倒くさいやつです。
※ ITILに則った運用を行なっているので、インシデント管理、問題管理、変更管理を順に回す必要があるわけです。詳しくは過去記事をぜひご覧ください↓
私がまだビギナーのため、このデータベースのデッドロックに向き合い必要があるため、少々長くなりますが、ご容赦ください...
1、ORA-00060について
今回ご紹介するORA-00060ですが、これはデッドロックを検出した際に出力するエラーです。
まず、ロックに関してですが、いかなるシステムでも、データベースが存在します。アプリで何か処理を行なった際にはロックを取得し、処理が終了するまでロックを保持するのがシステムの基本設計となっています。
デッドロックは、複数のトランザクションを実行した際に、互いが相手の占有ロックされている資源を要求して待ち状態となり、処理が一切実行されなくなる状態のことをさします。ちなみにデッドロック(deadlock)とは、「膠着状態」を意味する単語のようですww
例として、
2つのトランザクション(1と2)、2つのデータ(AとB)が存在する状態を仮定します。
(1) トランザクション1を実行しデータAへアクセス(ロックをかける)
(2) トランザクション2を実行しデータBへアクセス(ロックをかける)
(3) トランザクション1を実行しデータBへアクセス(すでにロック状態のため、待ち状態)
(4) トランザクション2を実行しデータAへアクセス(すでにロック状態のため、待ち状態)
この場合、相手のロックが解除されるまでの間は、永遠に待ち状態が続きます。
マジで不毛ですねww
図で描くとこんな感じですね(パワポで作ったのでちょっと変ですがそこは差っ引いてください)。オレンジの処理がロックされてるので、青は永遠に待機しています。
デッドロックの解説図
2、デッドロックの解決方法
では、次にこのデッドロックって解決できるのか?というところですが、これはケースによって対処方法が異なるようです。今回、私が体験したデッドロックは特定の表へのアクセスでデッドロックが起きたケースのため、これに関して記載します。
デッドロックは、そもそもどう頑張っても起きてしまうものなので、予防のために事前に対策を講ずることもあるのですが、発生してからの対処法としては、
デッドロック発生後にロールバックのプログラムを実行すればいいそうです。
本当にそうなのだろうかと疑問に思ってしょうがないのですが、これは私の宿題として、もっとわかった時にご説明します。
3、デッドロックの再現
ただ、どうしても今回はSQLPlusは上手くインストールできたのですが、Oracleの方が上手くインストールできないので、恥ずかしいお話ですが、実際に再現されている方のドンピシャのブログを見つけたので今回はそちらを代用させていただきたいと思います。
下記がリンクです↓
こちらの方はとても丁寧で、デッドロックを発生させた後に実際にアラートログ(システムにとって重要な情報を出力するログです。DB2の場合は、db2diag.logが該当)を確認されています。ぜひご参照ください。
4、終わりに
本日は、やや手抜きですが、デッドロックに関して説明しました。
私自身、今回の障害対応のおかげでデッドロックが何であるか?
解決策について今は理解できていないですが、どのような問題が存在するかを自身の中で整理できました。今回の記事でわからないことはまだあるので、今後も調査していきます。特に、デッドロックの検証を行う際に、Oracleのインストールができないと別のターミナル(端末)にてデータベースにアクセスする環境が整わないため、ここがクリアできません。なので、次回以降でOracleのインストールをやってみようと思います。
その方が今後も検証が早いので一石二鳥です!!
今回もお読みいただきありがとうございました。
明日以降も毎日更新していくので、よろしくお願いします!!