# 事务控制 * * * * * ### 闭包事务控制函数 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函数是控制事务的,以后研发中有哪些地方需要全部执行成功才进行处理就全封装成闭包然后往这个函数里面一丢就好咯。