Yii 框架不同逻辑处理方法统一事务处理
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 框架不同逻辑处理方法统一事务处理的更多相关文章
- 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
最近的一个项目碰到这种问题,摸索出了解决办法,故此记录下 example 如果控制器为 ShopCollect 方法为 UserList solution 请求的链接应该为 doman.com/sho ...
- YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)
YII 框架源码分析 百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...
- PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...
- yii框架的部署方法
yii框架(yii framework)的部署方法 刚開始学习的人来说,部署yii框架还是有一定难度的,Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web ...
- Yii框架CURD方法
在YII框架中,CURD有2种方式: 1.AR模式:2. DAO模式 AR模式下 查全部 MODEL $model->find()->asArray()->all()查单 个 ...
- YII框架的使用
YII框架的使用 spit: 吐痰,吐口水, 过去式: spat spat: 本身也可以作为一个单词, 意思是: "小打小闹""小的吵闹""小争吵&q ...
- 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...
- Yii 框架学习--01 框架入门
Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...
- yii框架
Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人 ...
随机推荐
- alpha冲刺(2/10)
前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 安排任务 博客撰写 构建之法的阅读 问题困扰: 分配任务,还是不熟练,对后台不熟悉,不知 ...
- 同一台电脑中同时安装oracle database 服务器端和oracle client 客户端时注意
如果在一台电脑中同时安装oracle的客户端和服务器端软件, 一定要先安装oracle database 服务端,并进行相应的配置 listener.ORA. 然后再去安装oracle client ...
- java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件
前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...
- 回顾HashMap
一.HashMap的原理简述 HashMap是基于哈希表的非线程安全的Map实现,内部采用数组+链表实现,其内部类Node定义了数据元素类型,它扩展了Map.Entry<K,V>增加了指向 ...
- cmake编译obs
https://blog.csdn.net/su_vast/article/details/74984213 https://blog.csdn.net/u011258240/article/deta ...
- 对数据进行GZIP压缩或解压缩
/** * 对data进行GZIP解压缩 * @param data * @return * @throws Exception */ public static String unCompress( ...
- 廖雪峰Java7处理日期和时间-4最佳实践-最佳实践
jdk提供了2套新旧的API来处理日期和时间. java.util * Date * Calendar java.time(JDK>=1.8) * Localdate * LocalTime * ...
- Java中常用类(包装类扩展知识)
Java常用类有哪些? 八大基本数据类型的包装类 包装类均位于java.lang包中,包装类和基本数据类型的对应关系如下表: 基本数据类型 包装类 byte Byte boolean Boolean ...
- 好看的java集合类图
http://blog.csdn.net/iamzp2008/article/details/38151971?utm_source=tuicool&utm_medium=referral 现 ...
- linux拷贝文件夹cp
方法就是: cp -r dir dir 如果只是拷贝文件的话直接cp即可