今儿没事,想对代码中事务进行测试,于是乎就创建了一个单元测试进行测试,发现在方法中加上@Transactional注解后,发现在想数据库中插入数据时,代码执行成功,但数据库中却没有数据,于是各种检查,比如:
1、让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2、让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) 3、不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED) 注意: 如果异常被try{...}catch{...}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{...}catch{throw Exception}。
可是....,还是不能解决问题。
冥冥之中,突然和一位同事讨论时,看到了这样一段话:
为了使测试数据不对数据库造成污染,在使用Spring_JUnit进行的单元测试的时候,默认会对事务进行回滚,即@Rollback 默认是true,如果想要测试数据不回滚,可设置@Rollback(value = false) 。如果是使用MySQL数据库,在设置了自动回滚之后,如果发现事务依然没有回滚,那么可以查看一下数据库引擎是否是Innodb,因为其他的数据库引擎如MyISAM、Memory 都不支持事务。
明白了,在单元测试中,事务是默认回滚了........