我尝试编写一个非常简单的代码来测试@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();
}
}
Run Code Online (Sandbox Code Playgroud)
当我通过创建一个新的RuntimeException()来单独测试add()方法时,它将回滚.这是我的预期.但是,当我运行test()方法时,当delete()抛出一个新的RuntimeException时,add()方法将不会回滚.这意味着add()和delete()不在同一个事务中,但我想要的是所有要回滚的东西.请帮忙.
@Transactionalon testPro()有3个不同的原因没有效果:
testPro() 是静态的.test()同一班级的内部呼叫.cases不是由Spring创建的.这意味着add()并且delete()正在两个单独的事务中运行.
为了证明这一点,尝试将传播更改delete()为MANDATORY.它现在将抛出异常,表示事务没有进行(或者是那种效果).
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |