# 事務控制
* * * * *
### 閉包事務控制函數 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異常閉包,是故意制造的一個異常測試咱們的函數是否好用。
咱們目前的數據表記錄如下:

可以看到目前 nickname 為 demo,下面咱們到控制器中實現測試閉包代碼如下:
~~~
$test = new LogicTest();
$test->testTransaction();
~~~
好了,控制器執行效果如圖:

除0異常出來了,那么咱們看看數據庫記錄是否修改成功

還是一樣沒有變化,說明咱們的事務控制是OK的。
那么咱們去掉異常部分代碼再試試,代碼如下:
~~~
/**
* 測試事務控制
*/
public function testTransaction()
{
$func1 = function()
{
model('Member')->setFieldValue(['username' => 'demo'], 'nickname', 'demo_test');
};
$func2 = function()
{
//$a = 1/0;
};
closure_list_exe([$func1, $func2]);
}
~~~
這次沒有報錯了,并且數據庫也發生了變化。

經過上面的測試大家就理解了,OneBase中的closure_list_exe函數是控制事務的,以后研發中有哪些地方需要全部執行成功才進行處理就全封裝成閉包然后往這個函數里面一丟就好咯。
- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列