Propagation.REQUIRES_NEW的作用是:无论当前上下文是否存在事务都会开启一个新的事务,但是有的时候我们会到配置不起作用的情况;这种情况一般是发生在同一个service调用中;
//当前在IAlarmService中
//这里不写默认是Propagation.REQUIRED
@Override
public void test() {
testInsert1();
testInsert2();
System.out.println(1/0);//让发生异常
}
//这里不写默认是Propagation.REQUIRED
@Override
public void testInsert1() {
Alarm alarm = new Alarm();
alarm.setDeviceId(UUID.randomUUID().toString());
alarm.setExpireTime(new Date());
alarm.setType(1);
alarm.setTenantId("123");
alarmMapper.insert(alarm);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void testInsert2() {
Alarm alarm = new Alarm();
alarm.setDeviceId(UUID.randomUUID().toString());
alarm.setExpireTime(new Date());
alarm.setType(2);
alarm.setTenantId("123");
alarmMapper.insert(alarm);
}
按理说test方法发生了异常,testInsert2因为是新开的事务是能够成功插入数据到数据库的,但是在同一个service中无法插入;这是因为在同一个service类中,方法调用通常是通过 this 引用来完成的,而不是通过代理对象。因此,Spring AOP 无法拦截这些方法调用,从而导致事务传播行为不起作用。
解决办法就是在不用的service类中调用;
//当前在IAlarmService中
//这里不写默认是Propagation.REQUIRED
@Override
public void test() {
testInsert1();
alipayService.testInsert2();//IAlipayService中调用
System.out.println(1/0);//让发生异常
}