一、简单的事务,单个数据库
/**
* 普通事务
* 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()
]);
}
}