DevsDawn
DevsDawn

ThinkPHP 6 多模型下事务处理

mysql下,事务不是针对某个特定的表或者特定的模型的,因此在多模型的情况下,不需要针对每个模型分别startTranscommitrollback。即使模型中有继承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();
        }
    }
}
若无特别说明,本文采用 CC BY-SA 4.0 协议进行许可。如需转载,请附上本文链接和本声明。
本文链接:https://devsdawn.com/2020/01/thinkphp-6-transaction-processing-under-multiple-models/
DigitalOcean云服务,美国上市公司,注册即送200USD体验金
Vultr云服务,全球25+地域,注册即送100USD体验金

发表回复

textsms
account_circle
email

DevsDawn

ThinkPHP 6 多模型下事务处理
mysql下,事务不是针对某个特定的表或者特定的模型的,因此在多模型的情况下,不需要针对每个模型分别startTrans、commit和rollback。即使模型中有继承startTrans方法,可以通过Model::st…
扫描二维码继续阅读
2020-01-20