正確使用事務(wù)
webman使用數(shù)據(jù)庫事務(wù)與其它框架是一樣的,這里列舉出需要注意的地方
代碼結(jié)構(gòu)
代碼結(jié)構(gòu)和其它框架是一樣的,例如Laravel用法(think-orm類似)
Db::beginTransaction();
try {
// ..業(yè)務(wù)處理略...
Db::commit();
} catch (\Throwable $exception) {
Db::rollBack();
}
這里特別需要注意的是必須使用\Throwable
而不能使用\Exception
,因?yàn)闃I(yè)務(wù)處理過程中可能觸發(fā)Error
,它并不屬于Exception
數(shù)據(jù)庫連接
當(dāng)事務(wù)中操作模型時(shí),特別需要注意模型是否設(shè)置了連接。如果模型設(shè)置了連接開啟事務(wù)的時(shí)候要指定連接,否則事務(wù)無效(think-orm類似)。例如
<?php
namespace app\model;
use support\Model;
class User extends Model
{
// 這里給模型指定了連接
protected $connection = 'mysql';
protected $table = 'users';
protected $primaryKey = 'id';
}
當(dāng)模型指定了連接時(shí),開啟事務(wù)、提交事務(wù)、回滾事務(wù)必須指定連接
Db::connection('mysql')->beginTransaction();
try {
// 業(yè)務(wù)處理
$user = new User;
$user->name = 'webman';
$user->save();
Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
Db::connection('mysql')->rollBack();
}
查找未提交事務(wù)的請求
有時(shí)候業(yè)務(wù)代碼bug導(dǎo)致某個(gè)請求事務(wù)沒有提交,為了快速定位哪個(gè)控制器方法未提交事務(wù),可以安裝webman/log
組件,該組件在請求完畢后會自動檢查是否有未提交的事務(wù),并記錄日志,日志關(guān)鍵字為Uncommitted transactions
webman/log安裝方法
composer require webman/log
注意
安裝后需要restart重啟,reload不生效