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 相关文章推荐
PHP 程序员也要学会使用“异常”
Jun 16 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
使用PHP编写的SVN类
Jul 18 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 PHP
Yii2使用表单上传文件的实例代码
Aug 03 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 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
php中的实现trim函数代码
2007/03/19 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
python提示No module named images的解决方法
2014/09/29 Python
python中函数总结之装饰器闭包详解
2016/06/12 Python
用pickle存储Python的原生对象方法
2017/04/28 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
详解Python3的TFTP文件传输
2018/06/26 Python
浅析python继承与多重继承
2018/09/13 Python
Python之列表实现栈的工作功能
2019/01/28 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
费用会计岗位职责
2014/01/01 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
职位证明模板
2015/06/23 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL