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 相关文章推荐
ajax实现无刷新分页(php)
Jul 18 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
PHP中设置时区方法小结
Jun 03 PHP
如何在php中正确的使用json
Aug 06 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
php封装实现钉钉机器人报警接口的示例代码
Aug 08 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 分页类实现代码
2009/12/03 PHP
php中session使用示例
2014/03/29 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
Python中的闭包实例详解
2014/08/29 Python
Python set集合类型操作总结
2014/11/07 Python
Python 类的特殊成员解析
2018/06/20 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Python socket 套接字实现通信详解
2019/08/27 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
Python中如何引入第三方模块
2020/05/27 Python
一些Unix笔试题和面试题
2013/01/22 面试题
六五普法规划实施方案
2014/03/21 职场文书
意向协议书范本
2014/04/23 职场文书
技术股东合作协议书
2014/12/02 职场文书
婚宴父母致辞
2015/07/27 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL