「データベースのトランザクションがアボートされる」というのは、強制的に処理(SQL)を中断されることだと思ってください。
基本情報技術者試験で点をとるためにやってきてくれたなら、「データの入れ替えに失敗したからロールバックする(巻き戻す)しかない」が理解できれば大丈夫。
たぶんですが、お仕事の世界でなら、よく見るメッセージは、この2つ。
- 【Oracle】「Abortによる切断」
→DB接続しようとして途中でキャンセルしたとき
→そもそもDB接続自体、できていないので、何も起きない - 【PostgreSQL】「現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます」
→DB更新時にエラーになるSQLを実行したとき。ロールバックするしかない
※PostgreSQLが日本語じゃないと「current transaction is aborted, commands ignored until end of transaction block.」って出るけど、これもアボートしたってこと。
OracleとPostgreSQL(かっこよく言うと「RDBMS」)で、アボート(中断)の意味合いは全く異なります。「トランザクションがアボート」と言えば、ほぼ、PostgreSQLのことかと。
一つだけいえるのは、もし、アボートされたら、「最後のコミットより後のSQLでは、何も更新されていない」ということ。SQLが悪いので、作り直して再トライです。
トランザクションのアボートとは、処理(SQL)が中断されること
トランザクションのアボートとは、処理(SQL)が中断されること。英語でabortは、「失敗する」とか「無駄に終わる」という意味らしいです。
知識が固まってない人向けに、簡単に、トランザクション、コミット、ロールバックについて解説します。
※急いでる人、ある程度の基礎知識がある人は、読む必要ないです。
トランザクションとは?
トランザクションは、一連の流れ、まとまった処理を表します。
ゲームに例えると、電源を付けてから、ゲームをプレイ、終了するまでの流れ。
データベースの世界でいえば、「データを入れ替えするときのまとまった処理」のようなイメージを持ってください。「データ入れるよ!」→「入れ終わったよ!」みたいな感じです。
コミット・ロールバックとは?
コミットは、トランザクション(データの入れ替え)を確定すること。ゲームでいえばセーブです。
ロールバックは、トランザクション(データの入れ替え)をなかったことにすること、開始前に巻き戻すことです。ゲームでいえば、リセットです。
トランザクションのアボートは、データの入れ替え(SQL)の中断
結局、「トランザクションのアボート」は、「データの入れ替え(SQL)の中断」です。
いろいろデータを登録したり更新したりしようとしたけど、ブチッっと中断された状態。データの入れ替えに失敗しています。
原因は、SQLにエラーがある(ほぼ、これ)、通信障害が発生したかのどっちかです。
トランザクションがアボートしたら、ロールバックしかない
そして、トランザクションがアボートしたら、ロールバック(巻き戻し)するしかありません。
突然、SQLがブチッっと中断されて、データがどうなったかもわからないのに、コミット(確定)はできません。
PostgreSQLでも「現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます」と出てきた状態で、強引にコミットしようとしたら、また同じメッセージが出てくるので、ロールバックするしかなかったはず・・・です。
トランザクションがアボートされた場合は、最後のコミットより後は何も更新されない
トランザクションがアボートされた場合は、最後のコミットより後は何も更新されない状態です。
たとえば、トランザクションA→B→Cをバッチか何かで順番に実行したときに。
トランザクションA・Bはコミットされたけど、Cでアボートされたとします。
すると、トランザクションCはロールバックするしかないので、コミットされたのは、A・Bのみ。
処理を再開するなら、Cから「もう一回遊べるドン!」となるわけです。
※余談だけど、トランザクションBでアボートされて、プログラムなりバッチがおかしくて、Cまで処理が流れてしまうという最低最悪の作りの場合(BはエラーだからCに行ってほしくない場合)。それも、Cはコミットされちゃったとしたら、素直にAの開始前にデータベースをリストアしたほうがいい(範囲が特定できるなら補正でもいいけど)・・・です。ウソみたいなホントの話だけど、本番環境で経験したんだから(*´ω`)。
基本情報技術者試験での出題例
基本情報技術者試験での出題例を挙げます。
トランザクションがアボートしたら、○○するしかないのがわかっていれば、楽勝かと。
まとめ
トランザクションのアボートときたら、強制的に処理(SQL)を中断されることです。
データの入れ替えに失敗しています。失敗しているのに、コミット(確定)はできないので、ロールバック(巻き戻し)一択です。
実際のお仕事で出くわしたら、SQLを修正して、もう一度実行してやってくださいまし(-_-;)。
コメント