正しくトランザクションを使用する
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では効果がありません。