2010-10-13 SQLの絵本 - 7章 データを守る仕組み SQL SQLの絵本―データベースがみるみるわかる9つの扉のメモ。 概要 トランザクション: 関連する操作をひとまとめにしたもの トランザクションが実行している間はデータをロックすることで作業の競合を防止する トランザクションの結果を反映するかどうかは選択できる コミット: トランザクションの結果を確定して終了する ロールバック: トランザクションの結果を取り消す(エラー時など) トランザクション データベースに対する関連した操作を一つにまとめたものをトランザクションと呼ぶ。 トランザクションの宣言 トランザクションは利用前に宣言する必要がある(Oracleでは不要)。 BEGIN TRANSACTION; に続いてまとめたい処理を記述する。 MySQLではSTART TRANSACTION、BEGIN、BEGIN WORKを用いる。また、InnoDBやBDBといったトランザクションセーフテーブルでなければトランザクションは利用できない。InnoDBテーブルはテーブル作成時にTYPE=InnoDBを指定することで作成できる(参考:MySQL トランザクション - とみぞーノート)。 トランザクションの終了にはコミットとロールバックという2種類の方法がある。 コミットとロールバック コミット トランザクションの操作が成功したらコミットを実行して処理を確定する。 COMMIT; ロールバック トランザクションの操作が失敗したなどでやり直したい場合はロールバックを実行して処理を取り消す。データは処理前の状態に戻る。 ROLLBACK; ロック トランザクションの処理中は処理対象のデータは保護(ロック)され、他からの操作ができないようになる。 ロックの種類 排他ロック: 操作中のデータは他から参照も変更もできない 共有ロック: 操作中のデータを参照することはできるが変更はできない デッドロック テーブルaをロックし、テーブルbにアクセスするトランザクションAと、テーブルbをロックし、テーブルaにアクセスするトランザクションBがあったとする。 このとき、トランザクションAとBがほぼ同時に実行されてしまうと、テーブルaとbは両方ともロックされ、これらを参照するトランザクションAとBはどちらも終わらなくなってしまう。 このような状態をデッドロックという。