トランザクション
■概要
トランザクションとはDBシステムで実行される処理のまとまり、
または作業単位のことです。
例えばATMでお金を振り込む処理の場合は以下の流れ全体を
1トランザクションとします。
①.口座Aから金額を引く
②.口座BにAで引いた金額を足す
トランザクションを意識して処理を実装することで、
データの整合性や障害復旧を行いやすくなります。
●ACID特性
トランザクションにはACID特性と呼ばれるトランザクションの
信頼性を保障するために意識しなければならない考え方があります。
・原子性 (ATOMICITY)
原子性はトランザクション内で実行する処理が全て完了するか
または全て行われないかのどちらかで中間的な状態がない性質です。
・一貫性 (CONSISTENCY)
一貫性は整合性とも呼ばれており、DBの内容に矛盾がなく
正常な状態が保たれる性質です。
例えば、商品の在庫数データは負の数を設定することが許されませんので
在庫数が負の数になるような処理を許可しないようにします。
・独立性 (ISOLATION)
独立性は更新中のデータが他のトランザクションに影響を
与えないようにする性質です。
この性質によって複数のトランザクションを同時に実行した場合と
1つずつ実行した場合の結果が同じになります。
・持続性 (DURABILITY)
持続性はトランザクションが終了した結果を障害などによって
データが損失しないようにする性質です。
■コミットとロールバック
トランザクションの結果はコミットがロールバックのいずれかが実行されます。
●コミット
コミットはトランザクション内の処理が全て問題ない場合に実行する処理で、
実行すると処理が確定し、トランザクションの結果がDBに反映されます。
コミット後のデータをロールバックすることはできません。
●ロールバック
ロールバックはトランザクション内の処理で問題が発生した場合に実行する処理です。
実行するとトランザクション開始時までデータが戻ります。
ロールバックはトランザクション内の処理(SQL)単位ではなく
トランザクション単位で行われます。
■SQL
SQLでトランザクションを実行するには「START TRANSACTION」「COMMIT」
「ROLLBACK」クエリを使用します。
●使用方法
各クエリはそのままで使用可能です。
・使用例
START TRANSACTION;
・注意点
トランザクションを開始したら必ずCOMMITかROLLBACKで
終了するようにしなければいけません。
・例
START TRANSACTION
別クエリ
別クエリ
COMMIT
●START TRANSACTION未使用
START TRANSACTIONを使わずにUpdateなどの更新(変更)クエリを
実行した場合は毎回自動でコミットされています。
START TRANSACTIONを使用することで自動コミットが無効になり、
自分たちで「COMMIT」クエリを実行しなければいけません。
●暗黙のコミット
一部のクエリはSTART TRANSACTIONを使用していても
暗黙的に実行後に自動コミットが行われます。
この自動コミットも止める場合は「SET AUTOCOMMIT」を使います。
・例
SET AUTOCOMMIT = 0
●AutoIncrement
AutoIncrementを使っているレコードに対してロールバックを行った場合
数値の加算だけは実行されているので注意して下さい。
・例
INT ID => AutoIncrement設定
VCHAR(32) Name
// 1回目
トランザクション開始
レコード追加 (Name => 山田太郎)
コミット
// 2回目
トランザクション開始
レコード追加 (Name => 鈴木一郎)
ロールバック
// 3回目
トランザクション開始
レコード追加 (Name =>山田花子)
コミット
レコード
ID => 1 Name => 山田太郎
ID => 3 Name => 山田花子
●サンプル
サンプル