Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的spring@Transactional需要can';你不会后退吗?_Java_Spring_Transactional - Fatal编程技术网

Java 为什么我的spring@Transactional需要can';你不会后退吗?

Java 为什么我的spring@Transactional需要can';你不会后退吗?,java,spring,transactional,Java,Spring,Transactional,我试图编写一个非常简单的代码来测试@Transactional,但当我使用Propagation.REQUIRED时,它不会回滚。这是代码 @Component public class A { private JdbcTemplate jdbcTemplate; @Resource(name="dataSource") public void setDataSource(DataSource dataSource) {

我试图编写一个非常简单的代码来测试@Transactional,但当我使用Propagation.REQUIRED时,它不会回滚。这是代码

    @Component
    public class A {

        private JdbcTemplate jdbcTemplate;

        @Resource(name="dataSource")
        public void setDataSource(DataSource dataSource) {
            this.jdbcTemplate = new JdbcTemplate(dataSource);
        }

        @Transactional(propagation=Propagation.REQUIRED)
        public void add(Person person) throws Exception {
        try {
            String sql = "insert into person (id, name) values(?,?)";
            jdbcTemplate.update(sql, new  Object[{person.getId(),person.getName()});
        } catch (Exception e) {
            throw new RuntimeException();
        }

        @Transactional(propagation=Propagation.REQUIRED)
        public void delete(String id) throws Exception {
            throw new RuntimeException();
            ***throw a RuntimeException on purpose***
        }
    }

    public class cases {

        @Transactional
        public static void testPro() throws Exception {
        try {
            AbstractApplicationContext aac = new ClassPathXmlApplicationContext("beans.xml");
            A a = (A) aac.getBean("a");
            a.add(***a random person***);
            a.delete("99");
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    @Test
    public void test() throws Exception {
        testPro();
    }
}

当我通过创建新的RuntimeException()单独测试add()方法时,它将回滚。这是我所期望的。但是,当我运行test()方法时,当delete()抛出新的RuntimeException时,add()方法不会回滚。这意味着add()和delete()不在同一事务中,但我想要的是回滚所有内容。请提供帮助。

@Transactional
on
testPro()
由于三个不同的原因无效:

  • testPro()
    是静态的
  • 调用是来自同一类中的
    test()
    的内部调用
  • 案例的实例
    不是由Spring创建的
  • 这意味着
    add()
    delete()
    在两个独立的事务中运行


    为了证明这一点,请尝试将
    delete()
    上的传播更改为
    必需的。现在,它将抛出异常,表示事务未在进行中(或类似的事情)。
    testPro()
    上的
    @Transactional
    由于三个不同的原因无效:

  • testPro()
    是静态的
  • 调用是来自同一类中的
    test()
    的内部调用
  • 案例的实例
    不是由Spring创建的
  • 这意味着
    add()
    delete()
    在两个独立的事务中运行


    为了证明这一点,请尝试将
    delete()
    上的传播更改为
    必需的。它现在将抛出异常,表示事务未在进行中(或类似的事情)。

    新的jdbTemplate(数据源)
    怎么样?我自己从未使用过它,但这对我来说似乎很奇怪。@Walfrat这就是使用springjdbc时应该做的事情。完全正常,你说得对。现在我知道这两个方法不在同一个事务中,但我不知道如何将它们放入同一个事务中。因此,我删除了static并尝试在案例中添加@Component,并创建了另一个CALS来调用testPro(),但它仍然不起作用。您阅读了Spring文档的章节了吗?关于新的jdbcemplate(数据源)
    ?我自己从未使用过它,但这对我来说似乎很奇怪。@Walfrat这就是使用springjdbc时应该做的事情。完全正常,你说得对。现在我知道这两个方法不在同一个事务中,但我不知道如何将它们放入同一个事务中。因此,我删除了static并尝试在案例中添加@Component,并创建了另一个cals来调用testPro(),但它仍然不起作用?