Java 为什么我的spring@Transactional需要can';你不会后退吗?
我试图编写一个非常简单的代码来测试@Transactional,但当我使用Propagation.REQUIRED时,它不会回滚。这是代码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) {
@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
ontestPro()
由于三个不同的原因无效:
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(),但它仍然不起作用?