在将一个Rails3.1.2的应用升级到Rails4.0后,突然发现以前运行的好好的程序无法使用了,抛出”Stack loop too deep”这个异常。
雅美蝶!!!怎么可能,我这个地方又没使用递归,我瞬间打开IDE,找到了出问题的地方。
1 | def transcation_in (detail, operator='系统') |
如代码所见,逻辑很简单,就是对一个Model对象的简单保存,并加入到关联对象中。这哪里会出现堆栈太深呢。
随后我加入了调试日志
1 | def transcation_in (detail, operator='系统') |
查看了日志,异常是在执行“detail.save”这个代码的是报的异常。这明明很正常呢。。。。日怪了。
调试日志看不出东西来,那我就进入了debugger模式,发现执行到这一步时,进入了active_record.transactions.rb这个类里面的save方法,但我没开启事务呢。难道是因为方法名字的问题???这有点扯蛋了。。。
我查看了我的Mysql数据表,确实是MyISAM引擎,改成InnoDB试试?尼玛,成功了!!!这里果然用了事务,当数据库表不支持事务时,就抛出了异常!!!
这错误异常信息也太扯蛋了嘛,提示和事务一点关系也没有!
希望这篇文章能为遇到同类问题的人提供解决办法,但问题的根源我还是没找到,为什么会用到事务了呢。