Codeigniter框架的更新事务(transaction)BUG及解决方法


Posted in PHP onJuly 25, 2014

由于ci事务判断出错回滚的条件是语句是否执行成功,而更新操作时,就算影响的条数为0,sql语句执行的结果过仍然为1,因为它执行成功了,只是影响的条数为0。

下面介绍解决这个问题的方法:

对于一次要执行许多的语句的事务

只需在更新操作下根据影响条数是否为0来决定是否会滚即可,下面假设第二条语句为更新操作。

//采用 Codeigniter 事务的手动模式

    $this->db->trans_strict(FALSE);

    $this->db->trans_begin();

        

    $this->db->query('SELECT ...');//SELECT 操作无需特殊处理

    $this->db->query('INSERT ...');//INSERT 出错会有 Codeigniter 自动处理

        

    $this->db->query('UPDATE ...');

    if (!$this->db->affacted_rows()) {//上面的 UPDATE 失败则回滚

        $this->db->trans_rollback();

        //@todo 异常处理部分

        exit();//需要终止或跳出,以免下面的 SQL 代码继续执行!

    }

        

    $this->db->query('DELETE ...');

    if (!$this->db->affacted_rows()) {//上面的 DELETE 失败则回滚

        $this->db->trans_rollback();

        //@todo 异常处理部分

        exit();//需要终止或跳出,以免下面的 SQL 代码继续执行!

    }

        

    $this->db->query('SELECT ...');//SELECT 操作无需特殊处理

    $this->db->query('INSERT ...');//INSERT 出错会有 Codeigniter 自动处理

        

    if ($this->db->trans_status() === TRUE) {

        $this->db->trans_commit();

    } else {

        $this->db->trans_rollback();

        //@todo 异常处理部分

    }

如果一次执行的语句不是很多,可以在最后做一下判断来决定回滚

若语句中没有更新操作,用自动事务就可以。

PHP 相关文章推荐
xml在joomla表单中的应用详解分享
Jul 19 PHP
JSON在PHP中的应用介绍
Sep 08 PHP
thinkphp 多表 事务详解
Jun 17 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
分享10段PHP常用代码
Nov 11 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 #PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 #PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 #PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 #PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 #PHP
php实现与erlang的二进制通讯实例解析
Jul 23 #PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 #PHP
You might like
用Zend Encode编写开发PHP程序
2010/02/21 PHP
学习php中的正则表达式
2014/08/17 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
2016/05/24 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
Python操作Access数据库基本步骤分析
2016/09/19 Python
python添加模块搜索路径方法
2017/09/11 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
Apache部署Django项目图文详解
2019/07/30 Python
python实现简单图书管理系统
2019/11/22 Python
python 实现任务管理清单案例
2020/04/25 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
协议书怎么写
2014/04/21 职场文书
数控机床专业自荐信
2014/05/19 职场文书
法制教育演讲稿
2014/09/10 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
2014年团总支工作总结
2014/11/21 职场文书
关于运动会的宣传稿
2015/07/23 职场文书