首页 > 代码库 > 代码中的事务无法回滚

代码中的事务无法回滚

问题来源

有一小伙伴,事务提交是加在方法级上的。并且方法里写了几个更新数据库表的操作。然而当数据前几个顺利执行通过后,发现最后一个操作并未通过。按照一般的事务管理规则,此刻是应该触发事务回滚的。然而并没有触发,前两次操作成功地写入了数据库,最后一次失败告终。

问题追踪

项目大体是使用mysql数据库,管理事务是在spring中完成。其实这里跟开发语言没有任何关系,无论使用什么语言什么框架,都有可能遇到此类问题。分别以下述步骤进行了一番分析:

  1. 查看源码,发现没有逻辑错误

  2. 比对其他方法,业务异常

  3. 到目前为止只能怀疑数据库了

    1. 查看数据库的配置也无什么异常分别是InnoDB以及utf-8编码

    2. 比对操作的表,发现出错的表里使用的引擎(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


代码中的事务无法回滚