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+php动态载入与分页
Oct 09 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
PHP检测移动设备类mobile detection使用实例
Apr 14 PHP
PHP多文件上传类实例
Mar 07 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
Feb 03 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
PHP rsa加密解密算法原理解析
Dec 09 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导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
php eval函数一句话木马代码
2015/05/21 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python文件处理
2016/02/29 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Python hashlib模块加密过程解析
2019/11/05 Python
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
小学生操行评语大全
2014/04/22 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
2014年派出所工作总结
2014/11/21 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android