首页 > 代码库 > 代码中的事务无法回滚
代码中的事务无法回滚
问题来源
有一小伙伴,事务提交是加在方法级上的。并且方法里写了几个更新数据库表的操作。然而当数据前几个顺利执行通过后,发现最后一个操作并未通过。按照一般的事务管理规则,此刻是应该触发事务回滚的。然而并没有触发,前两次操作成功地写入了数据库,最后一次失败告终。
问题追踪
项目大体是使用mysql数据库,管理事务是在spring中完成。其实这里跟开发语言没有任何关系,无论使用什么语言什么框架,都有可能遇到此类问题。分别以下述步骤进行了一番分析:
查看源码,发现没有逻辑错误
比对其他方法,业务异常
到目前为止只能怀疑数据库了
查看数据库的配置也无什么异常分别是InnoDB以及utf-8编码
比对操作的表,发现出错的表里使用的引擎(engine)是MyISAM,跟其他表的不一样
结论
mysql一共提供了两种引擎(engine),即InnoDB和MyISAM。查看两种引擎的区别不难发现:
InnoDB supports transactions which is not supported by tables which use MyISAM storage engine.
InnoDB has row-level locking, relational integrity i.e. supports foreign keys, which is not possible in MyISAM.
InnoDB ‘s performance for high volume data cannot be beaten by any other storage engines available.
另外还有一个分析对比,选择合适的引擎:
My ISAM InnoDB Required full text Search Yes 5.6+ Require Transactions Yes frequent select queries Yes frequent insert,update,delete Yes Row Locking (multi processing on single table) Yes Relational base design Yes
代码中的事务无法回滚