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 empty() 检查一个变量是否为空
Nov 10 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
PHP面向对象详解(三)
Dec 07 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
thinkPHP分页功能实例详解
May 05 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
详解PHP队列的实现
Mar 14 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生成静态html文件的三种方法
2013/06/18 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
几款好用的python工具库(小结)
2020/10/20 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
上级检查欢迎词
2014/01/18 职场文书
商务助理求职信范文
2014/04/20 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
开展警示教育活动总结
2015/05/09 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
Java 多线程协作作业之信号同步
2022/05/11 Java/Android