問題 16★★☆

受注担当者が、ある注文の数量を誤った値に更新し、そのトランザクションを コミットした。その直後に誤りに気づいた。このときの状況の説明として、 最も適切なものはどれか。

正解:ア

各選択肢の解説

  1. ア変更はコミットで確定しているので、正しい数量に直す更新を改めて行う。

    正解。コミットした時点で変更は確定し、ロールバックの対象から外れます。 誤りを直すには、正しい値に書き換える新たな更新を行います。

  2. イロールバックを実行すれば、コミットした更新を取り消して元の数量に戻せる。

    誤り。ロールバックで取り消せるのは、まだコミットしていない更新だけです。 どちらも「トランザクションの終わり方」なので何度でも切り替えられると 誤解しがちですが、確定させるか取り消すかは一度しか選べません。

  3. ウ更新した行にはロックが掛かったままなので、他の利用者はその行を更新できない。

    誤り。排他制御のロックは、トランザクションがコミットかロールバックで 終わった時点で解除されます。更新の途中なら他の利用者を待たせますが、 コミット後まで掛かり続けるわけではありません。

  4. エこの後にシステム障害が起きると、コミットした更新も取り消されて元の数量に戻る。

    誤り。障害が起きたときに取り消されるのは、コミットしていない途中の トランザクションです。コミット済みの更新は、障害があっても失われないよう 守られます。取り消されるかどうかの境目がコミットです。

理解を深めるために

コミットは「確定」のボタン

申込書を書いている途中なら、消しゴムで何度でも直せます。しかし提出して 受け付けられたあとは、消しゴムでは戻せず、訂正の申込みを出し直すしかありません。 データベースのコミットは、この「提出」にあたります。

コミットの前と後で何が変わるか

トランザクションは、コミットかロールバックのどちらかで終わります。

  • コミット前 … 更新はまだ確定していない。ロールバックすれば開始前に戻せる。 更新中のデータにはロックが掛かり、他の利用者は待たされる
  • コミット後 … 更新が確定する。ロールバックの対象ではなくなり、ロックも解除される。 障害が起きても、確定した更新は失われないよう守られる

つまり、コミットした後に誤りに気づいたら、「取り消す」のではなく 「正しい値に直す更新を新しく行う」ことになります。業務システムで訂正伝票を 起こすのと同じ考え方です。

混同しやすい説明との違い

操作・仕組み いつ働き、何をするか
コミット 成功したトランザクションの更新を確定させる。以後は取り消せない
ロールバック コミット前の更新を取り消し、トランザクションの開始前に戻す
排他制御(ロック) トランザクションの実行中だけ、他の処理にデータを触らせない
障害時の回復 未コミットの処理は取り消し、コミット済みの更新は残す

試験では「コミットした後」か「コミットする前」かが分かれ目です。 取り消せる、待たされる、障害で消える、はいずれもコミット前の話と覚えておくと整理できます。

前の問題へデータベースの一覧へ戻る