这篇内容挺深奥的,先收藏着。
致19楼 求问:
一:事务是PHP的事 还是 MYSQL的事?
二:如果是数据库MYSQL的事。那JAVA 处理事务 和PHP 处理事务 不是一样么。难道数据库驱动不一样,某些数据库方法PHP相对JAVA没有实现?
致红蓝双方:
我大概看出。你们讨论的在CI中 普通的SQL.CI也包装成事务了 是不是?
在技术讨论交锋中,出现一些不是很好的词语不太应该滴。观点上可以擦出火花,用词上最好不要有不好的词语。
这篇讨论很有意义
好象很复杂,以致于我头很大!!!!!!!!
{:soso_e137:}
手动提交$this->db->trans_commit();就不会有这样的问题了
好文章啊
TO 22楼。
为什么要用事物?
在我个人理解,事物,就是封装了多个数据库操作。比如你要删除一个类别设定,你就必须判断这个类别下是否有新闻(假如是新闻类别),你要删除新闻,你就必须判断这条新闻下是否有评论。
使用事物,是把多次的SQL操作集成在一个逻辑中,从这个角度,用强类型的JAVA,和弱类型的PHP,似乎无差别。可实际情况真的是这样吗?
事物是程序驱动的,事物虽然在数据库的层面操作,但返回的内容仍然需要程序来接收。不要告诉我你不了解PHP和JAVA的区别,否则这样的讨论没有丝毫的意义。
另外,22楼的理解能力有待提高。
如果吧普通的SQL操作也封装成事物,那我只能仰天叹惜一声:欧麦高的!
我也碰到楼主的问题:因为公司的业务还不是很大,下单量没那么频繁。
所以我做了个很详细的日志记录,记录事务里的每条SQL,并且附上执行结果,记录了一个星期,所有的SQL都是成功执行;
问题是:日志记录了SQL和成功的执行结果,但数据库就是找不到这条数据!电话联系下单用户他说显示下单成功,很诡异吧。
显然问题就指向$this->db->trans_complete(); 了;
:time:
楼主说的很有道理,我把源码这一块看了一下果然有这个坑。
貌似作者在使用$this->db->query()的时候,都会把trans_status调成false,然后后面的事务提交都会失败。
总结一下,可以这么理解:作者把每一个query()执行之前添加了一个$this->db->trans_start()。这样的话,如果query()执行失败,会导致之后页面的事务都执行后回滚。
要解决这个问题的话,其实最好给query()增加一个是否在事务中的判断,本来trans_depth可以实现的,但是trans_depth这个功能并没有完成。