mysql下,事务不是针对某个特定的表或者特定的模型的,因此在多模型的情况下,不需要针对每个模型分别startTrans
、commit
和rollback
。即使模型中有继承startTrans
方法,可以通过Model::startTrans();
启动事务,但其作用等同于Db:startTrans();
。因此可以直接写为以下形式。
通过测试,在出现异常时,通过图中自增值可看出(自增值在rollback时也会增加),三个模型尝试新增数据都被rollback。同时把Table3
中的name
字段改为test233
的操作也没有成功。
<?php
namespace app\controller;
use app\BaseController;
use app\model\Table1;
use app\model\Table2;
use app\model\Table3;
use think\Exception;
use think\facade\Db;
class Test extends BaseController
{
public function index(){
Db::startTrans();
try{
$table1 = new Table1();
$table1->save([
'name' => 'test1'
]);
$table2 = new Table2();
$table2->save([
'name' => 'test2'
]);
$table3 = new Table3();
$table3->save([
'name' => 'test3'
]);
$test = Table3::where('name', 'test3')->find();
$test->name = 'test233';
$test->save();
throw new Exception('test exception');
Db::commit();
} catch (\Exception $e) {
Db::rollback();
}
}
}
发表回复