はむはむエンジニアぶろぐ

365日エンジニアリング

PHPのClosureを利用したトランザクション処理

f:id:secret_hamuhamu:20150404170600p:plain
とあるPHPで実装されたOSSのトランザクション処理が、とてもエレガントだったのだがOSSの名前を忘れてしまった。
しょうがないので自分の記憶を頼りに真似してみようと思う。

Closureを利用したトランザクション処理

<?php
class DbConnection
{
    public static function transactional(Closure $func)
    {
      $con = DbConnection::getConnection();
        $con->begin();
        try {
            $res = $func();
            $con->commit();
            return $res;
        } catch (Exception $e) {
            $con->rollback();
            throw $e;
        }
    }

    ・
    ・
    ・

}

// 実行コード
try {
    $param1 = $paramCreator->create1();
    $param2 = $paramCreator->create2();
    DbConnection::transactional(function () use ($param1, $param2) {
        $this->dao1->insert($param1);
        $this->dao2->update($param2);
    });
} catch(Exception $e) {
    // 例外処理
}

うむ。
Closureをうまく使ったフック処理だと思う。
トランザクションの範囲を考えてtry~catchが複雑にならなくて済む。
他の言語でも使えるうまいテクニックですね。

オススメの本

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

  • 作者: 川瀬裕久,古川文生,松尾大,竹澤有貴,小山哲志,新原雅司
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/04/21
  • メディア: 大型本
  • この商品を含むブログを見る

CD付 SQL ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

CD付 SQL ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)