在使用SPRING的事务控制时,事务一般都是加在SERVICE层的,这个时候如果一个SERVICE调用另一个SERVICE时如何保持事务一致?比如第二个SERVICE抛出了异常,第一个SERVICE回滚。
这就要先介绍spring的7种类型的事务传播行为
其中我们要用到第一种,
<tx:method name="add*" propagation="REQUIRED"/>
测试代码
@Test
public void testAddUser() throws Exception {
UserServiceImpl service = (UserServiceImpl) context.getBean("userServiceImpl", UserServiceImpl.class);
USER u = new USER();
u.setCreated("2015-05-05");
u.setCreator(123);
u.setName("test");
u.setPassword("test");
service.addUser(u);
}
SERVICE层:
public void addUser(USER user) throws Exception {
userDaoImpl.saveUser(user);
delByUsername(user.getName());
}
public void delByUsername(String name) throws Exception {
// String s = null;
// s.length();
throw new RuntimeException("runtime e");
}
让第二个SERVICE抛出运行时异常,测试会发现这个时候第一个SERVICE的事务也回滚了,USER没有插入数据库中。 在事务传播为propagation=”REQUIRED”的时候,如果SERVICE抛出运行时异常,则所有的SERVICE共享同一事务。 如果想要SERVICE抛出所有异常都能回滚,那么就要在propagation=“REQUIRED"后面加上rollback-for=“Exception”
那么如何在远程调用别人接口(例如dubbo调用)时,保持事务一致性呢?那么就要用到分布式事务了。