在webman-admin中,控制器寫了一個簡單操作,使用到了事務(wù),使用回滾之后,但是不生效。
明明我在try和catch都已經(jīng)回滾了,但是還是不生效。
引用類為 support\Db;
public function test(Request $request): Response
{
if ($request->method() === 'POST') {
[$id, $data] = $this->updateInput($request, false);
$money = $data['operate_value'] ?? 0;
Db::beginTransaction();
try {
if($data['operate_type'] == 1){
User::money($money, $id, MoneyLog::ADMIN_OPERATE);
}elseif($data['operate_type'] == 0){
User::money(bcmul($money,-1, 2), $id,MoneyLog::ADMIN_OPERATE);
}
Db::rollBack();
}catch (\Exception $e){
Db::rollBack();
return $this->fail(1);
}
return $this->success();
}
return raw_view('user/test');
}
事物要使用相同的連接才能生效。以下是個人的解決方法
在 plugin/admin/app/functions.php
文件中添加以下函數(shù)
/**
* 返回DB鏈接
* @param string $connection
* @return Connection
*/
function M(string $connection = 'plugin.admin.mysql'): Connection
{
return Db::connection($connection);
}
然后在控制器中使用
M()->beginTransaction();
事務(wù)開啟
M()->commit();
事務(wù)提交
M()->rollBack();
事務(wù)回滾
切記不要用Db,否則回滾會失敗的