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