# 全自動事務
* * * * *
**簡介**
在 數據 > 事務控制 章節咱們講解了 如何通過閉包控制事務,但是實際項目開發中存在一些問題就是咱們必須提前將需要處理事務的代碼刻意封裝在閉包中且對于復雜的業務流程中多處驗證返回上會不是很便利,若一套較為復雜的業務邏輯(比如多個分散的類或文件中都進行了需要數據操作)這種情況可能導致循環執行事務也可能導致沒有循環但是執行了多次事務(實際上還是無法有效的保證數據完整性)。
下面咱們再來分享一種事務控制的方式
```
/**
* 自動封裝事務
*/
function trans($parameter = [], $callback = null)
{
try {
Db::startTrans();
$backtrace = debug_backtrace(false, 2);
array_shift($backtrace);
$class = $backtrace[0]['class'];
$result = (new $class())->$callback($parameter);
Db::commit();
return $result;
} catch (Exception $ex) {
Db::rollback();
throw new Exception($ex->getMessage());
}
}
```
這個函數用于將頂層的方法自動嵌套到事務處理中。
**使用方式**
控制器中:
```
// 測試事務
public function tranEvent()
{
return trans($this->param, 'tranTest');
}
// 事務處理入口
public function tranTest($param = [])
{
dump($this->logicIndex->test($param));
}
```
業務邏輯中:
```
/**
* 測試操作
*/
public function test($data = [])
{
$this->modelArticle->setInfo(['name' => '666'], ['id' => 23]);
1/0;
//... 比如這里有多長很長的業務邏輯處理
//... 比如這里還執行了某文件里面的數據庫操作
//... 比如這里執行了數據驗證 比如 積分不足? 余額不足? 等操作
return [RESULT_SUCCESS, '操作成功'];
}
```
**解決的問題**
1.面向切面的事務控制,若初期開發中業務邏輯層沒有考慮到事務控制,那么后面想加入事務機制只需要在控制器中加一個類似于事件的方法中轉即可,業務層的代碼基本上不需要改動。
2.避免了業務流程復雜時 循環執行事務及多個事務分散在各處無法保證多個事務都OK的情況。
3.清爽的代碼將控制器中四處可見的 try catch 消滅掉。
4.有效提升了開發效率,開發者在編寫業務邏輯時無需考慮數據完整性問題。
5.有效控制事務的同時也與OneBase目前返回跳轉及提示機制完美兼容,不知不覺已經在所有的代碼上自動加上了事務控制。
- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列