# 事务控制
* * * * *
### 闭包事务控制函数 closure_list_exe
~~~
/**
* 通过闭包列表控制事务
*/
function closure_list_exe($list = [])
{
Db::startTrans();
try {
foreach ($list as $closure) : $closure(); endforeach;
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
throw $e;
}
}
~~~
这个函数是作者封装后处理事务控制的,通过里面的代码可以看出参数为闭包数组,也就是这一组闭包都处理成功没有异常则提交,出现异常则回滚。
* * * * *
### 事务控制演示
咱们在测试逻辑中创建事务测试代码如下:
~~~
/**
* 测试事务控制
*/
public function testTransaction()
{
$func1 = function()
{
model('Member')->setFieldValue(['username' => 'demo'], 'nickname', 'demo_test');
};
$func2 = function()
{
$a = 1/0;
};
closure_list_exe([$func1, $func2]);
}
~~~
$func1 闭包对member表中用户名为demo的记录进行了一个nickname昵称的设置,值设置为 demo_test。
$func2 是一个除0异常闭包,是故意制造的一个异常测试咱们的函数是否好用。
咱们目前的数据表记录如下:
![](https://box.kancloud.cn/3da18138b8a7ca42a47002c3726d35d0_784x146.png)
可以看到目前 nickname 为 demo,下面咱们到控制器中实现测试闭包代码如下:
~~~
$test = new LogicTest();
$test->testTransaction();
~~~
好了,控制器执行效果如图:
![](https://box.kancloud.cn/fcb4637b3ce5a2224d5817bcfea0d2c5_1884x482.png)
除0异常出来了,那么咱们看看数据库记录是否修改成功
![](https://box.kancloud.cn/3da18138b8a7ca42a47002c3726d35d0_784x146.png)
还是一样没有变化,说明咱们的事务控制是OK的。
那么咱们去掉异常部分代码再试试,代码如下:
~~~
/**
* 测试事务控制
*/
public function testTransaction()
{
$func1 = function()
{
model('Member')->setFieldValue(['username' => 'demo'], 'nickname', 'demo_test');
};
$func2 = function()
{
//$a = 1/0;
};
closure_list_exe([$func1, $func2]);
}
~~~
这次没有报错了,并且数据库也发生了变化。
![](https://box.kancloud.cn/c1104bb4d0fed0640cfb8a4c69bde851_812x146.png)
经过上面的测试大家就理解了,OneBase中的closure_list_exe函数是控制事务的,以后研发中有哪些地方需要全部执行成功才进行处理就全封装成闭包然后往这个函数里面一丢就好咯。
- 序言
- 基础
- 安装环境
- 安装演示
- 规范
- 目录
- 介绍
- 后台介绍
- 后台首页
- 会员管理
- 系统管理
- 系统设置与配置管理
- 菜单管理
- 系统回收站
- 服务管理
- 插件管理
- 文章管理
- 接口管理
- 优化维护
- SEO管理
- 数据库
- 文件清理
- 行为日志
- 执行记录
- 统计分析
- 接口介绍
- 接口文档
- 错误码设计
- Token介绍
- 前台介绍
- 架构
- 架构总览
- 生命周期
- 入口文件
- 模块设计
- 依赖注入
- 控制器架构
- 逻辑架构
- 验证架构
- 服务架构
- 模型架构
- 行为架构
- 插件架构
- 配置
- 配置介绍
- 配置加载
- 配置扩展
- 请求
- 请求信息
- 日志
- 后台行为日志
- 系统执行日志
- 框架日志
- 数据
- 数据库设计
- 数据字典
- 数据库操作
- 事务控制
- 混合操作
- 实战
- 控制器
- 逻辑与验证
- 视图与模型
- 插件研发
- 服务研发
- 接口研发
- 杂项
- 数据导入导出
- 二维码条形码
- 邮件发送
- 云存储服务
- 支付服务
- 短信服务
- 微信分享
- 生成海报
- 聊天室
- PJAX
- Demo
- Widget
- 附录
- 常量参考
- 配置参考
- 函数参考
- 进阶
- Redis
- 自动缓存
- 全自动缓存
- 索引
- 数据签名
- 全自动事务
- 队列