正しくトランザクションを使用する

webmanはデータベーストランザクションの使用において他のフレームワークと同様ですが、いくつか注意すべき点があります。

コード構造

コード構造は他のフレームワークと同様です。例えばLaravelの使い方(think-ormに類似):

Db::beginTransaction();
try {
    // ..ビジネス処理は省略...

    Db::commit();
} catch (\Throwable $exception) {
    Db::rollBack();
}

ここで特に注意が必要なのは、必ず\Throwableを使用しなければならず、\Exceptionを使用してはいけないことです。ビジネス処理中にErrorが発生する可能性があり、これはExceptionには含まれません。

データベース接続

トランザクションでモデルを操作する際には、モデルが接続を設定しているかどうかに特に注意してください。モデルが接続を設定している場合、トランザクションを開始する際には接続を指定する必要があり、さもなければトランザクションは無効になります(think-ormに類似)。例えば:

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // ここでモデルに接続を指定しています
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

モデルが接続を指定している場合、トランザクションの開始、コミット、ロールバックには必ず接続を指定する必要があります。

Db::connection('mysql')->beginTransaction();
try {
    // ビジネス処理
    $user = new User;
    $user->name = 'webman';
    $user->save();
    Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
    Db::connection('mysql')->rollBack();
}

未コミットトランザクションのリクエストを検索する

時にはビジネスコードのバグにより、特定のリクエストのトランザクションがコミットされないことがあります。どのコントローラのメソッドがトランザクションをコミットしていないかを迅速に特定するために、webman/logコンポーネントをインストールすることができます。このコンポーネントはリクエストが完了した後に未コミットのトランザクションがあるかを自動的にチェックし、ログを記録します。ログのキーワードはUncommitted transactionsです。

webman/logのインストール方法

composer require webman/log

注意
インストール後はrestartで再起動する必要があり、reloadでは効果がありません。