Codeigniter框架的更新事务(transaction)BUG及解决方法

2015-01-24信息快讯网

这篇文章主要介绍了Codeigniter框架的更新事务(transaction)BUG及解决方法,具体BUG和解决办法在文中有详细描述,需要的朋友可以参考下

由于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实现的sqlite数据库连接类
jQuery Mobile + PHP实现文件上传
PHP使用header()输出图片缓存实例
Codeigniter框架实现获取分页数据和总条数的方法
Yii的CDbCriteria查询条件用法实例
Yii框架获取当前controlle和action对应id的方法
Yii核心组件AssetManager原理分析
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Codeigniter购物车类不能添加中文的解决方法
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
PHP中strtr字符串替换用法详解
浅析php适配器模式(Adapter)
php中ltrim()、rtrim()与trim()删除字符空格实例
php函数serialize()与unserialize()用法实例
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
跟我学Laravel之视图 & Response
php中unserialize返回false的解决方法
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
PHP中可以自动分割查询字符的Parse_str函数使用示例
PHP结合JQueryJcrop实现图片裁切实例详解
php实现与erlang的二进制通讯实例解析
Yii使用CLinkPager分页实例详解
php.ini save_handler 修改不生效的解决办法
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
完善CodeIgniter在IDE中代码提示功能的方法
CodeIgniter中实现泛域名解析
CodeIgniter中使用cookie的三种方式详解
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
CodeIgniter模板引擎使用实例
PHP缓存机制Output Control详解
PHP关于htmlspecialchars、strip_tags、addslashes的解释
PHP中strlen()和mb_strlen()的区别浅析
php smarty truncate UTF8乱码问题解决办法
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
利用谷歌 Translate API制作自己的翻译脚本
php开启openssl的方法
PHP中isset()和unset()函数的用法小结
©2014-2024 dbsqp.com