• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

tp6 Thinkphp 6 - 事务操作(自动(transaction) / 手动(startTrans))

Data: 2018-12-17 16:22:31Form: JournalClick: 16

首页你的数据库引擎必须为 InnoDB 引擎才能使用。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。

哪个数据表需要事务操作,就更改哪个表的数据库引擎也可以。

表改引擎方法:【数据库表上右键】→【设计表】→【选项】→【引擎】→【InnoDB】

TP6 提供了 3 种事务操作 API:

  1. 自动处理:transaction

  2. 手动处理:startTrans

  3. 分布式事务:我没用过,请查其它资料。


使用的时候注意啊。注意 注意 注意  控制器加载

use think\facade\Db;

最简单的方式是使用 transaction 方法操作数据库事务,当闭包中的代码发生异常会自动回滚,例如:

Db::transaction(function () {
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
});


手动控制事务,例如:

// 启动事务
Db::startTrans();
try {
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
    // 提交事务
    Db::commit();
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
}

注意在事务操作的时候,确保你的数据库连接使用的是同一个。


可以支持MySQL的XA事务用于实现全局(分布式)事务,你可以使用:

Db::transactionXa(function () {
    Db::connect('db1')->table('think_user')->delete(1);
    Db::connect('db2')->table('think_user')->delete(1);
}, [Db::connect('db1'),Db::connect('db2')]);


我的使用方法:

use think\facade\Db;

// 启动事务
Db::startTrans();
try {
    $data = [];
    $moneyinfo = new Students();
    $result = $moneyinfo->insertAll($data);
    if (!$result) {
        throw new \Exception('插入数据失败!');
    }
    // 提交事务
    Db::commit();
    return json(['msg' => '处理成功', 'status' => 200]);
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
    return json(['msg' => '处理失败,' . $e->getMessage(), 'status' => 400]);
}


Name:
<提交>