【SQL】トランザクション、コミット、ロールバック

トランザクションとは

DBに対して複数の処理が行われるとき、それを1つのまとまった処理として扱うこと。

(よくある例)
誰かに送金するとき。
1、A口座が減る
2、B口座が増える

別の処理だがどちらかの処理だけ成功したりするのはNGですよね。
そのために1つにパッケージングしてくれる機能。

トランザクションの目的と種類

目的:データの整合性を保ちやすく、イレギュラー(システム的というよりはユーザー的に)な処理になりにくい。また、障害復旧時も役に立つ。

トランザクション処理したユーザー登録機能があるとする。
ユーザー名、名前、電話番号、アドレス のうち、アドレスだけ空だと、ロールバックし、アドレスだけ空の状態は許さないことができる。
そのために、不完全なユーザー登録を防ぐことができるというわけだ。

f:id:aruku-hito:20191201164644p:plain

ACID特性

・原子性 (ATOMICITY)
トランザクション内で実行する処理が全て完了するか、または全て行われないかのどちらかで中間的な状態がない性質です。(0か100か的なイメージ)

・一貫性 (CONSISTENCY)
整合性とも呼ばれており、DBの内容に矛盾がなく正常な状態が保たれる性質です。
例えば、商品の在庫数データは負の数を設定することが許されませんので在庫数が負の数になるような処理を許可しないようにします。

・独立性 (ISOLATION)
独立性は更新中のデータが他のトランザクションに影響を与えないようにする性質です。
ぼぼ同じタイミング、またはトランザクション処理実行中に同じ処理が来ても、ごちゃ混ぜではなく、現状の処理を終わらせた後に、次のトランザクションに移り、ちゃんと1つずつ順序だてて実行してくれる。

・持続性 (DURABILITY)
持続性はトランザクションが終了した結果を障害などによってデータが損失しないようにする性質です。
この性質の保証のために、一般的にはトランザクションのログを記録しておき、障害が起きた場合はログを使用して障害発生前の状態に復旧する。

コミットとロールバック

COMMIT :トランザクション処理を確定させる処理。
ROLLBACK:トランザクション処理を中断、または取り消す処理。

書き方

$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

$mysqli->set_charset('utf8');

// トランザクション開始
$mysqli->begin_transaction();

try {
	// UPDATE
	$sql = "UPDATE gc_granola SET price=400 WHERE id = 11";
	$res = $mysqli->query($sql);

} catch( Exception $e ){
	// エラーが起きたらロールバック
	$mysqli->rollback();
}

// 正常に終了したらコミット
$mysqli->commit();

$mysqli->close();

参考記事
https://qiita.com/komattio/items/838ea5df68eb076e8099qiita.com
https://yttm-work.jp/lang/mysql/mysql_0004.htmlyttm-work.jp

https://qiita.com/Sobue-Yuki/items/8016acbf11483b070804qiita.com