データの確定と中止(コミットとロールバック)
トランザクションによる処理が正常に終了した場合に、その変更処理を有効な結果と確定し、データベースに反映することをコミットといいます。そのとき、「トランザクションが完了した」ことを認識させるために、「COMMIT」という命令を発行します。また、トランザクションによる処理の途中で何らかの障害が発生した場合に、それまでの変更処理を無効なものとし、トランザクションが実行される前の状態に戻すことをロールバックといいます。このとき、「トランザクションが中止された」ことを認識させるために「ROLLBACK」という命令を発行します。一度COMMITを発行しトランザクションを完了すると、変更した内容はROLLBACKを発行しても元のデータに戻すことが出来なくなります。
この「COMMIT」や「ROLLBACK」はSQLの命令の仲間です。これまでの連載の中でお話してきた3つあるSQLの種類の中の「データ制御言語(DCL)」がこの「COMMIT」や「ROLLBACK」になります。
データの同時更新
データベースには様々なデータが入っており、常にデータの検索、更新が行われています。あるデータへ同時に更新作業が起こるとデータの不整合が起こる可能性があります。
AさんがBさんへ5万円振り込みます。この作業が完了していないうちに、Bさんが3万円引き出します。この場合、後から作業を行ったBさんの更新データだけが有効になってしまい、Bさんの残高は7万円ということになってしまいます。
正しくは、12万円です。これを正しくシステムで実現する為には、排他制御を利用します。