このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

  • 追加された行はこの色です。
  • 削除された行はこの色です。
*目次 [#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命令などの場合、命令実行後に変更が確定するので、ロールバックできないことに注意。

*トランザクションの分割 [#j273a5ed]

-大量データのバッチ処理において、トランザクションの原則の1つである原子性を磨耗路として、1つのトランザクションが長くなってしまった結果、DBMSのリソースを使い切ってエラーになってしまう場合がある。
--OracleにおけるORA-1555
-処理できない(エラーが起こる)ようなサイズのトランザクションは適切に分割しなければならない。
--トランザクションを分割するとエラー時の再実行が難しくなる。[[データパッチ]]を行って再実行可能にしたり、SEが手動でエラー以降の処理を実行する。
-トランザクションを分割していないことの典型的な原因は次の通りである。
--バッチ処理の分割のポリシーが決まっていない。もしくは分割しないポリシーである。
--大量データを用いたバッチ処理の試験をしていない。
--リソースの容量監視をしていない。

*トランザクションをまとめる [#dbb017d7]

-DBMSのリソースに余裕があるにもかかわらず、不用意にコミットを実行してトランザクションを分割してしまっている場合は、トランザクションを1つにまとめた方がよい。
-不用意にAutoCommit機能を有効にすることで、SQLごとにコミットされてしまう。
--つまり、業務から見た最適なトランザクションの単位(処理の単位)かどうかに関わらず、各SQLごとに子もっとされてしまう。

*参考文献 [#x0610a9b]

-『RDBMS解剖学』
-『情報処理技術者試験ポケットスタディ 応用情報技術者』
-『DB SELECTION 44のアンチパターンに学ぶDBシステム』