关于引入JTA项目,程序代码块中添加Transactional注解会失效

最近在我的项目总是配置了事务注解,但事务注解总感觉是没有生效的,就给自己留下了很多疑惑,今天正好整明白了做个总结,分享一下。

@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)建表事务不会回滚,插入语句会回滚

发布了3 篇原创文章 · 获赞 0 · 访问量 1410

猜你喜欢

转载自blog.csdn.net/weixin_42322068/article/details/103921972