DBエラー(ORA-00054)

こんばんは、カズヤんです。

今日は、最近実行するSM21(シスログ確認)にて超頻繁に見るエラーについて共有します。まあ、多分SQLの話なので、ABAPerの方とかはきっとご存知なんだとは思いますが、ちょっと書かせてください。

 

Oracleのデータベースを使っていると出てくるエラーで、

ORA-00054っていうエラーです。

 

ORA-00054:リソース・ビジー、NOWAITが指定されていました。

 

とログに出力されています。リソースビジーはなんとなくわかる。おそらく、データベースのテーブルにアクセスしようとしたらほとんどのテーブルが埋まっちゃってるてきな感じかと思います。

 

一応、書いてる人めっちゃいるので、NOWAITに関しては下記を確認しました。

sakuramochi702.hatenablog.com

 

SQLでは、「FOR UPDATE」と記述することで行単位でロックを取得できるそうです。この、ロックした行に対して別セッションにてアクセスしようとした際に、「FOR UPDATE NOWAIT」とすることで、待機ではなく強制的にエラーにすることができるそうです。

 

つまり、アクセスする側にてロックしている行にアクセスしたが、アクセスできるまで待機するのではなく、エラーを返すということです。

 

結論、SAPシステムのSM21を叩いて、シスログにORA-00054と表示されていても実際には、トランザクションが実行されてエラーで終わるのでシステムに変更が加わっていないわけです。システム稼動にクリティカルな影響がない場合がほとんどだと思います。ただし、そのトランザクションがエラーで終わって、その後の時間に同じのが実行されていてまたエラーだったら是正策はすべきです。

 

解決したい場合には、「FOR UPDATE NOWAIT」とするのではなく、「FOR UPDATE WAIT 秒数」とかにすれば、指定した時間はロックが解除されるまで待機することとなります。

 

一応、SAPやってて、シスログでこのエラー見かけたら基本的には問題ないと認識して良しです。複数出るようでしたらSQL書き換えたり、最悪待ち時間指定するパラメータ変更などの恒久対応が必要かと思います。

 

では、今日はこれにて失礼します!!