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. day02python 整型 布尔

    今日内容 int bool 详细内容 1.整型(int) Py2 32位电脑 64位电脑 超出范围后python将自动转换成long(长整型) /运算不能显示小数-> (整形除法只能保留整数位) ...

  2. node day2 vue read html

    app.js var http = require("http"); var fs = require('fs'); var url = require('url'); http. ...

  3. html框架以及属性字体应用

    今日java开课,下午老师讲解了java的第一节课,有关于html的框架,为了自己方便以后也会在日记中添加一些便签方便自己使用. 了解这一些之后老师发布的作业也让我对码代码有了更深的认知,码完作业之后 ...

  4. poj2228 Naptime【(环结构)线性DP】

    Naptime Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:3374   Accepted: 1281 Descriptio ...

  5. 让docker容器开机启动

    网上有些文章说,要让docker 的容器自动在开机启动,是写脚本,比如在 rc.local 中写.其实完全没必要这么麻烦,docker 有相关指令,docker run 指令中加入 --restart ...

  6. multiprocessing还是threading?

    今夜看了一篇分析python中多进程与多线程优劣的文章,文章通过几组性能测试强调了多进程的性能优势,同时也深入分析了为何python中多线程性能较差的原因,GIL就是解释器全局锁,该机制限制每个pyt ...

  7. Delphi 7升级到XE2的字符串问题

    原来的Delphi中有两种字符串:AnsiString和WideString.默认的string即AnsiString.而在Delphi 2009中,新增加了一种UnicodeString.为什么不沿 ...

  8. [蓝桥杯]PREV-44.历届试题_青蛙跳杯子

    问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  9. 廖雪峰Java6 IO编程-3Reader和Writer-2Writer

    1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):v ...

  10. django 多线程下载图片

    example1: from multiprocessing.dummy import Pool as ThreadPool #多线程 import time import urllib2 urls ...