问题来源
有一小伙伴,事务提交是加在方法级上的。并且方法里写了几个更新数据库表的操作。然而当数据前几个顺利执行通过后,发现最后一个操作并未通过。按照一般的事务管理规则,此刻是应该触发事务回滚的。然而并没有触发,前两次操作成功地写入了数据库,最后一次失败告终。
问题追踪
项目大体是使用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
时间: 2024-11-05 09:19:08