当前位置: 代码迷 >> 综合 >> thinkPHP5 数据库事务 分布式事务 模型使用事务 跨数据库事务
  详细解决方案

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

热度:72   发布时间:2023-11-08 21:42:51.0

在用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