用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2132|回复: 3
收起左侧

[HELP] 请问如何手动回滚事务啊?

[复制链接]
发表于 2013-7-29 10:26:44 | 显示全部楼层 |阅读模式
执行一条SQL查询:删除 ID IN (1,2,3,18,97)的文章。
我想等删除完成后再检查是不是删除了这些文章($this->db->affected_rows();),如果1,2,3,18,97其中有一个文章没删,则提示指定的文章ID数组有错误,并回滚操作。
请问要怎么写啊?

能不能用类似下面的方法写出来?在哪地方写成败判断及回滚操作?
$this->db->trans_start();
$this->db->query($sql_del); //执行删除操作(当然我知道把ID一条一条的删写在这里肯定行的。就不知道效率与IN相比哪个更好些)
$this->db->trans_complete();

发表于 2013-7-29 12:57:14 | 显示全部楼层
本帖最后由 muneo 于 2013-7-29 12:58 编辑

??事务,我记得好像是只要你不complete,他就自动回滚呀,如果数据库服务器没有设置auto_complete
发表于 2013-7-29 18:06:28 | 显示全部楼层
手册上说affected_rows在mysql中delete返回值是0;

其实如果当其中有一条记录不能删除,回滚,也就是说其中有一条删除不成功,其他的也都不删除了。也没必要循环或者用in,我用个最笨的办法。

PHP复制代码
 
        $sql = '';
        $this->db->trans_begin();
        foreach(...){
            $sql .= "delete ....";//拼接语句,如果数量不大的话
        }
        $this->db->query($sql);
        if ($this->db->trans_status() === FALSE){
            $this->db->trans_rollback();
        }else{
            $this->db->trans_commit();
        }
 
复制代码



其实我一直在纠结和楼主一样的问题....一直没找到比较合适的办法
发表于 2013-9-24 21:56:29 | 显示全部楼层
affected_rows默认是可用的!
所以放心用就可以了!
不信你可以测试一下!

database 类有一个小 hack 允许返回正确的被影响的行数。默认情况下这个 hack 功能是打开的但可以在数据库驱动文件中关闭它。

本版积分规则