thinkPHP5 数据库事务 分布式事务 模型使用事务 跨数据库事务

在用tp5做项目的时候,因为使用了分库分表的,这个时候的事务是需要分步提交的
第一种 也就是最简单的事务 单个数据库

	/**
     * 普通事务
     * 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()
            ]);
        }

    }

参考链接:https://www.kancloud.cn/manual/thinkphp5/118059

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值