1、定义事务处理接口

<?php

namespace frontend\business\SaveRecordByransactions;

/**
* Interface ISaveForTransaction 事物提交接口
* @package frontend\business\RewardTransactions
*/
interface ISaveForTransaction
{
function SaveRecordForTransaction(&$error,&$outInfo);
}

2、新建统一事务处理的方法类

<?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;
}
}

3、要进行事务处理的方法类必须继承事务处理接口ISaveForTransaction 并重写里面的SaveRecordForTransaction方法

<?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;
}
}

4、调用事务处理

实例化不同业务处理类到数组$transActions,最后统一调用事务处理方法RewardSaveByTransaction

<?php
$transActions = [];
$transActions[] = new ModifyBalanceByAddRealBean($userBalance,$param);
$transActions[] = new ModifyGift($params); if(!SaveByTransUtil::RewardSaveByTransaction($transActions,$error))
{
return false;
}

  

 

Yii 框架不同逻辑处理方法统一事务处理的更多相关文章

  1. 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接

    最近的一个项目碰到这种问题,摸索出了解决办法,故此记录下 example 如果控制器为 ShopCollect 方法为 UserList solution 请求的链接应该为 doman.com/sho ...

  2. YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  3. PHP开发框架之YII框架学习——碾压ThinkPHP不是梦

      前  言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...

  4. yii框架的部署方法

    yii框架(yii framework)的部署方法 刚開始学习的人来说,部署yii框架还是有一定难度的,Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web ...

  5. Yii框架CURD方法

    在YII框架中,CURD有2种方式: 1.AR模式:2. DAO模式 AR模式下 查全部   MODEL  $model->find()->asArray()->all()查单 个  ...

  6. YII框架的使用

    YII框架的使用 spit: 吐痰,吐口水, 过去式: spat spat: 本身也可以作为一个单词, 意思是: "小打小闹""小的吵闹""小争吵&q ...

  7. 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

    原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...

  8. Yii 框架学习--01 框架入门

    Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...

  9. yii框架

    Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人 ...

随机推荐

  1. Js高级 部分内容 面向对象

    1.单列模式 2.工厂模式 3.构造函数 (1)类 js天生自带的类 Object基类 Function  Array  String  Number  Math Date Boolean Regex ...

  2. codeforces 804A Find Amir 思维/水题

    A few years ago Sajjad left his school and register to another one due to security reasons. Now he w ...

  3. vue学习笔记——组件的优化

    Vue 应用性能优化指南 1 给组件定义name,然后在同级目录新建index文件: import Count from './count.vue' export Count; 2 优化大数据的列表 ...

  4. PythonStudy——三种字符串 Three strings

    # 普通字符串:u'以字符作为输出单位'print(u'abc') # 用于显示 # 二进制字符串:b'' 二进制字符串以字节作为输出单位print(b'abc') # 用于传输 # 原义字符串:r' ...

  5. Go之unsafe.Pointer && uintptr 类型

    Go语言是个强类型语言.Go语言要求所有统一表达式的不同的类型之间必须做显示的类型转换.而作为Go语言鼻祖的C语言是可以直接做隐式的类型转换的. 也就是说Go对类型要求严格,不同类型不能进行赋值操作. ...

  6. CANVAS笔记

    bglayer.add(bgimage) /*后面的层会覆盖前面的,所以要放在上面的,就要后面才添加!*/ bglayer.add(this.shape1) Layer.destroy() layer ...

  7. day 13

    递归函数   一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题, ...

  8. LDAP学习总结

    一.简介: LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议.目录是一个为查询.浏览和搜索而优化的数据库,它成树状结构组织数据,类 ...

  9. .Net MVC TextBoxFor 扩展 placeholder 与 class 属性

    namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static MvcHtmlString Bs ...

  10. EXCEL统计不重复值的数量

    如这一列中,有多少不重复值? 1.可以点击,数据,删除重复项,清除重复值,然后剩下的统计一下即可知道:       ===> 2.用公式:=SUMPRODUCT((MATCH(E3:E20,E3 ...