みなさんはINNODBのトランザクション処理をどのように使っていますか?
利用している言語(PHP とかそういうの)のデータベースドライバ(PDO とかそういうの)で、トランザクションの開始、コミット、ロールバック、を行うためのメソッドがあるのでそれを使っています。
なので start transaction
のような SQL の直接実行は基本的にしません(Isolation Level を明示したいときに set transaction ...
することはありますが稀です)。
また、コード上のトランザクションブロックをクロージャーの中に入れて、トランザクションの開始やコミットをライブラリで隠蔽することもあります。次のようなイメージです。
lang
1$db->transaction(function ($db) {
2 // いろいろやる
3 // クロージャーの呼び出しの前後で自動的にトランザクションの開始/コミットが行われる
4 // 例外で突き抜けるとトランザクションがロールバックされる
5});
なぜこんなことをするかというと、大抵の場合トランザクションは次のようなコードを毎回書く必要があり、DRY じゃないからです。
lang
1$db->beginTransaction();
2
3try {
4 // いろいろやる
5
6 $db->commit();
7} catch (\Exception $ex) {
8 try {
9 $db->rollBack();
10 } catch (\Exception $ex2) {
11 }
12}
↑のクロージャーを使った例だと、transaction
メソッドの中にトランザクションの開始・コミットや try/catch を隠蔽させてます。
また用途はどんなものに使っていますか。月次のバッチ処理などでしょうか。
更新系の処理ではほぼ使っています。逆に、特別な理由がない限り「使わない」ということはしていません。
参照系の処理では、読み取り一貫性が必要かどうか考えて使うかどうか決めます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。