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 相关文章推荐
关于文本留言本的分页代码
Oct 09 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
php 3行代码的分页算法(求起始页和结束页)
Oct 21 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
PHP中redis的用法深入解析
Feb 20 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
Linux中为php配置伪静态
Dec 17 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
php strftime函数的详细用法
Jun 21 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
php libevent 功能与使用方法详解
Mar 04 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入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
php数组使用规则分析
2015/02/27 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
四查四看剖析材料
2014/02/14 职场文书
倡议书范文
2014/04/16 职场文书
公司股东出资证明书
2014/11/01 职场文书
外出考察学习心得体会
2016/01/18 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
nginx请求限制配置方法
2021/07/09 Servers
用JS写一个发布订阅模式
2021/11/07 Javascript
Ruby处理CSV数据方法详解
2022/04/18 Ruby
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python