正確使用事務

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();
}

查找未提交事務的請求

有時候業務代碼 bug 導致某個請求事務沒有提交,為了快速定位哪個控制器方法未提交事務,可以安裝 webman/log 組件,該組件在請求完畢後會自動檢查是否有未提交的事務,並記錄日誌,日誌關鍵字為 Uncommitted transactions

webman/log 安裝方法

composer require webman/log

注意
安裝後需要 restart 重啟,reload 不生效