一、定義事務處理接口php
<?php namespace frontend\business\SaveRecordByransactions; /** * Interface ISaveForTransaction 事物提交接口 * @package frontend\business\RewardTransactions */ interface ISaveForTransaction { function SaveRecordForTransaction(&$error,&$outInfo); }
二、新建統一事務處理的方法類數組
<?php namespace frontend\business; use frontend\business\SaveRecordByransactions\ISaveForTransaction; use yii\base\Exception; use yii\db\Transaction; use yii\log\Logger; class SaveByTransUtil { /** * 事物保存支持 * @param $objList 須要保存的對象數組, * @param $error * @return bool * @throws \yii\db\Exception */ public static function RewardSaveByTransaction($objList,&$error,&$outInfo = null) { $error =''; if(!isset($objList) || !is_array($objList)) { $error = '非法對象,不是數組'; return false; } foreach($objList as $obj) { if(!($obj instanceof ISaveForTransaction)) { $error = '對象數組中存在非ISaveForTransaction對象'; return false; } } $outInfo = []; $trans = \Yii::$app->db->beginTransaction(Transaction::REPEATABLE_READ); try { foreach($objList as $obj) { if(!$obj->SaveRecordForTransaction($error,$outInfo)) { if(is_array($error)) { \Yii::getLogger()->log(var_export($error,true).' type:'.var_export($obj,true),Logger::LEVEL_ERROR); } else { \Yii::getLogger()->log($error.' type:'.var_export($obj,true),Logger::LEVEL_ERROR); } $trans->rollBack(); return false; } } $trans->commit(); } catch(Exception $e) { $error = $e->getMessage(); $trans->rollBack(); return false; } return true; } }
三、要進行事務處理的方法類必須繼承事務處理接口ISaveForTransaction 並重寫裏面的SaveRecordForTransaction方法app
<?php namespace frontend\business\SaveRecordByransactions\SaveByTransaction; use frontend\business\SaveRecordByransactions\ISaveForTransaction; use yii\base\Exception; /** * 修改增長實際豆數 * Class ModifyBalanceByTicketToCash * @package frontend\business\UserAccountBalanceActions */ class ModifyBalanceByAddRealBean implements ISaveForTransaction { private $balance = null; private $extend_params=[]; /** * @param $record * @param array $extend_params * @throws Exception */ public function __construct($record,$extend_params=[]) { $this->balance = $record; $this->extend_params = $extend_params; } public function SaveRecordForTransaction(&$error,&$outInfo) { //邏輯處理 return true; } }
四、調用事務處理frontend
實例化不一樣業務處理類到數組$transActions,最後統一調用事務處理方法RewardSaveByTransactionyii
<?php $transActions = []; $transActions[] = new ModifyBalanceByAddRealBean($userBalance,$param); $transActions[] = new ModifyGift($params); if(!SaveByTransUtil::RewardSaveByTransaction($transActions,$error)) { return false; }