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中使用XML
Oct 09 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
小谈php正则提取图片地址
Mar 27 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
PHP实现本地图片转base64格式并上传
May 29 PHP
PHP array_reverse() 函数原理及实例解析
Jul 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实现采集中国天气网未来7天天气
2014/10/15 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
Python 文件和输入输出小结
2013/10/09 Python
Python常用内置函数总结
2015/02/08 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python try except 捕获所有异常的实例
2018/10/18 Python
什么是python的列表推导式
2020/05/26 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
致长跑运动员加油稿
2014/02/20 职场文书
运动会开幕式主持词
2014/03/28 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis