Thinkphp 6 - 数据库事务、分布式事务、模型使用事务、跨数据库事务(详细的使用实例,可直接复制用于您的项目中去)

文章详细介绍了在Laravel框架中如何进行简单的事务操作,包括单数据库的普通事务,以及涉及分库分表和模型事务的分布式事务处理。通过实例展示了如何在多数据库间开启事务并管理回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简单的事务,单个数据库

/**
 * 普通事务
 * return json
 */
public function demo01(){

    // 开启事务
    Db::startTrans();
    try{

        // 添加数据
        Db::table('article') -> insert(['title' => '测试事务']);

        Db::commit();
        return json([
            'error_code' => 0,
            'msg' => 'success'
        ]);
    }catch (\Exception $e){
        Db::rollback();
        return json([
            'error_code' => 400,
            'msg' => $e ->getMessage()
        ]);
    }
}

二、使用分库分表,多个数据库

/**
 * 分库事务
 * return json
 */
public function demo02(){

    // 开启默认数据库的事务
    Db::startTrans();

    // 开启指定的数据库 数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集
    Db::connect('mysql://root:root@127.0.0.1:3306/laravel#utf8') -> startTrans();

    try{

        // 插入数据
        Db::table('article') -> insert(['title' => '分布式回滚']);

        Db::connect('mysql://root:root@127.0.0.1:3306/laravel#utf8')
            -> table('shop_order')
            -> insert(['order_number' => date('YmdHis')]);

        // 提交
        Db::commit();
        Db::connect('mysql://root:root@127.0.0.1:3306/laravel#utf8') -> commit();
        return json([
            'error_code' => 0,
            'msg' => 'success'
        ]);
    }catch (\Exception $e){

        // 回滚
        Db::rollback();
        Db::connect('mysql://root:root@127.0.0.1:3306/laravel#utf8') -> rollback();
        return json([
            'error_code' => 400,
            'msg' => $e -> getMessage()
        ]);
    }
}

三、使用模型事务

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/10/6
 * Time: 11:20
 */

namespace app\index\model;

use think\Model;

class OrderModel extends Model {

    // 绑定表
    protected $table = 'shop_order';

     设置当前模型的数据库连接
    //protected $connection = [
    //    // 数据库类型
    //    'type'        => 'mysql',
    //    // 服务器地址
    //    'hostname'    => '127.0.0.1',
    //    // 数据库名
    //    'database'    => 'laravel',
    //    // 数据库用户名
    //    'username'    => 'root',
    //    // 数据库密码
    //    'password'    => 'root',
    //    // 数据库编码默认采用utf8
    //    'charset'     => 'utf8',
    //    // 数据库表前缀
    //    'prefix'      => '',
    //    // 数据库调试模式
    //    'debug'       => false,
    //];


    public function __construct($data = [])
    {
    	// 这样可以动态更改模型的数据库连接 可以使用不同的数据
        $this -> connection = [
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址
            'hostname'    => '127.0.0.1',
            // 数据库名
            'database'    => 'laravel',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => 'root',
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
            // 数据库表前缀
            'prefix'      => '',
            // 数据库调试模式
            'debug'       => false,
        ];
        parent::__construct($data);
    }
}
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/10/6
 * Time: 11:20
 */

namespace app\index\model;

use think\Model;

class DetailModel extends Model {

    // 绑定表
    protected $table = 'shop_detail';

     设置当前模型的数据库连接
    //protected $connection = [
    //    // 数据库类型
    //    'type'        => 'mysql',
    //    // 服务器地址
    //    'hostname'    => '127.0.0.1',
    //    // 数据库名
    //    'database'    => 'laravel',
    //    // 数据库用户名
    //    'username'    => 'root',
    //    // 数据库密码
    //    'password'    => 'root',
    //    // 数据库编码默认采用utf8
    //    'charset'     => 'utf8',
    //    // 数据库表前缀
    //    'prefix'      => '',
    //    // 数据库调试模式
    //    'debug'       => false,
    //];

    public function __construct($data = [])
    {

        $this -> connection = [
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址
            'hostname'    => '127.0.0.1',
            // 数据库名
            'database'    => 'laravel',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => 'root',
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
            // 数据库表前缀
            'prefix'      => '',
            // 数据库调试模式
            'debug'       => false,
        ];
        parent::__construct($data);
    }
}
/**
 * 分布式事务 使用模型 多个模型 只需一个模型开启事务即可
 * return json
 */
public function demo03(){

    // 开启事务 多个模型 只需要开启一个即可
    $orderModel = new OrderModel;
    $orderModel -> startTrans();
    try{
        $detailModel = new DetailModel;

        // 新增数据
        $orderModel -> order_number = date('YmdHis');
        $orderModel -> save();
        // throw new Exception('回滚');
        // 新增数据
        $detailModel -> detail = time();
        $detailModel -> save();

        // 提交事务
        $orderModel -> commit();
        return json([
            'error_code' => 0,
            'msg' => 'success',
        ]);

    }catch (\Exception $e){

        // 事务回滚
        $orderModel -> rollback();
        return json([
            'error_code' => 400,
            'msg' => $e -> getMessage()
        ]);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王二红

请作者喝杯咖啡 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值