*目次 [#ted28046] #contents *トランザクション [#l87072e5] -トランザクションはアトミック性(成功か不成功かの2つに1つ)を持つため、トランザクションスコープに含まれているすべての処理が終わらないとトランザクションは終了しない。 -アトミック性を持たせるために、一部が遅延するだけでユーザーへの結果表示が待たされることがある。よって、トランザクションは必要最小限の処理しか含まないようにしないと無駄が生まれる。 例:振込み処理において、振込先の増額と振込元の減額がセットに行わなければデータが不正になる。 ◇ *トランザクションスコープ [#w8f65c1b] -トランザクションの開始から終了までの範囲(スコープ)のこと。 -どの処理までを1つのトランザクションに含めるのかを既定する。 *トランザクション管理 [#p5e85926] -[[RDBMS]]は1つ1つの[[SQL]]を処理するだけなので、SQLの実行に失敗したときにどこまで戻すのかがわからない。どこまで戻すのかを指定するのは、SQLを発行するアプリケーション側の役割である。このために、SQLにはcommit,rollback(abort)などのトランザクションを表現する命令が用意されている。 -SQLを発行するアプリケーション側の事故により、commitあるいはrollbackのどちらも発行していないトランザクションが発生してしまうことがある。 --この場合は、RDBMSが未完のトランザクションを検出した時点で、強制的にrollbackを実行する。 *トランザクション管理用の命令 [#ked07dc2] **rollback(abort) [#x50cf2d6] -トランザクションの途中で異常が起こり、処理が完了できなかったことをRDBMSに通知する。 -RDBMS側はこの通知を受け取ると、DBの状態をトランザクションの開始時点まで巻き戻し、処理が何もなかったように見せる。 **commit [#s806ad65] -トランザクションが正常に完了したことを通知する。 -commitが発行したトランザクションの結果は、どのようなことがあっても失ってはならない。 **begin [#nc71bc82] -rollbackやcommitを発行すると、その後新しいトランザクションを開始する。 -アプリケーションが最初にRDBMSに接続した時点で新しいトランザクションが始まることもある。 -RDBMSによっては明示的にトランザクションを始めるためにbeginを用意していることもある。 --[[PostgreSQL]]など *各種SQLにおけるトランザクション管理 [#l2fc5361] **MySQL [#a2333326] -[[MySQL]]データベースでは、テーブルの型によってはトランザクションが利用できない。 --一般にはInnoDB型が使われる。 -BEGIN命令によってトランザクションが開始される。 -COMMIT命令を実行すると変更が確定する。 --BEGINとCOMMITの間にINSERT,UPDATE,DELETE命令が行われる。 -ROLLBACK命令により変更が元に戻る。 --TRUNCATE,DROP DATABASE/TABLE命令などの場合、命令実行後に変更が確定するので、ロールバックできないことに注意。 *参考文献 [#x0610a9b] -『RDBMS解剖学』 -『情報処理技術者試験ポケットスタディ 応用情報技術者』