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. 几种数据格式的处理 - Python

    1. CSV数据 import csv csvfile = open('data_text.csv','rb') reader = csv.reader(csvfile) # 返回数据为列表类型 # ...

  2. How to Install Tomcat 8.0.27 on CentOS/RHEL and Ubuntu【转】

    https://tecadmin.net/install-tomcat-8-on-centos-rhel-and-ubuntu/ Apache Tomcat is an opensource web ...

  3. Ubuntu16.04中pip无法更新升级,采用源码方式安装

    1.从pip官网下载最新版 https://pypi.org/project/pip/#files 2.ubuntu中创建文件位置,我的放在一下路径,之后进行解压 3.解压后进入pip的文件夹,在执行 ...

  4. MySQL:日期函数、时间函数总结(MySQL 5.X)

    http://www.cnblogs.com/she27/archive/2009/01/16/1377089.html 原文:http://www.51sdj.com/phpcms/picture/ ...

  5. Eclipse Java EE IDE for Web Developers集成的Maven 3 指向自己安装的 Maven

    一.配置Maven环境 1.下载apache-maven文件,选择自己需要的版本,地址:Apache 官方下载地址是http://maven.apache.org/download.cgi 2.下载并 ...

  6. ANSI编码导致的乱码

    美帝那边的一个 donet 项目,打开后发现一段string里面各种乱码.一通折腾后发现是编码格式问题.这段string所在的类文件保存格式为ANSI,而不是VS默认的UTF-8. ANSI编码电脑是 ...

  7. 在Docker中监控Java应用程序的5个方法

    译者注:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.通常情况下,监控的主要目的在于:减少宕机 ...

  8. Ubuntu 16.04 安装 JDK 1.8

    系统环境 Ubuntu 16.04; JDK 1.8 配置安装 1.首先从oracle下载jdk 1.8,我下载的版本是jdk-8u131-linux-x64.tar.gz,运行tar zvxf jd ...

  9. vim中行末去掉^M

    方式1: 输入 :%s/^M//g 方式2: 输入:%s/\r//g

  10. WordPress版微信小程序2.2.0版发布

    2017年8月12日WordPress版微信小程序2.2.0版通过了微信的审核正式发布,此版本的更新以完善功能为主.主要更新的功能是:站内链接,猜你喜欢,热点文章. WordPress版微信小程序开放 ...