最近在我的项目总是配置了事务注解,但事务注解总感觉是没有生效的,就给自己留下了很多疑惑,今天正好整明白了做个总结,分享一下。
@Transactional(rollbackFor = Exception.class)
这是我之前加的这个事务注解,但总是未生效的
通过新写一个小单元测试:
@Test
@Transactional(rollbackFor = Exception.class)
public void insertTab() throws Exception{
String createDictionaryTableB = "create table test20200110\r\n" + "(\r\n" + "KEY INTEGER,\r\n"
+ "D VARCHAR2(100) ,\r\n"
+ "E VARCHAR2(100) ,\r\n" + "F DATE\r\n" + ")";
sqlMapper.excuteSql(createDictionaryTableB);
String contentA = "INSERT INTO test20200110 (KEY,D,E,F) VALUES (1,'项目1','变化值1',to_date('2019-10-31 00:00:00','yyyy-mm-dd hh24:mi:ss'))";
sqlMapper.excuteSql(contentA);
String contentB = "INSERT INTO test20200110 (KEY,D,E,F) VALUES (3,'项目3','变化值3',to_date('2019-10-31 00:00:00','yyyy-mm-dd hh24:mi:ss'))";
sqlMapper.excuteSql(contentB);
if(1==1){
throw new SQLException("1111");
}
System.out.println("-------事务开始回滚-------");
}
结果:
在上面的截图中发现有JTA事务回滚的写法,而我的项目中是没有用到的,应该是框架的代码引进来(但是默认应该是false才对),而执行结果在数据库中也存了值,事务明明回滚了,为啥就没有用呢?
尝试在配置文件中显示配置:
清除之前表结构和内容,重新执行单元测试,结果
表结构还存在,但是内容不会生成了,说明现在的事务是发挥了作用。
总结:
(1)凡是引入JTA的项目 就算未使用 也需要手动显式声明JTA为flase,未手动声明的话,事务会被JTA接管 导致事务注解失效,脏数据产生
(2)建表事务不会回滚,插入语句会回滚