@Service
public class TestService {
@Autowired
private UserDao userDao;
@Autowired
private TestService testService;
@Transactional
public void methodA() {
userDao.upAgeById(1);
try {
testService.methodB();
} catch (Exception e) {
e.printStackTrace();
}
int x = 10;
if (x == 10) {
throw new RuntimeException("methodA() 出错了");
}
}
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
userDao.downAgeById(2);
int x = 9;
if (x == 10) {
throw new RuntimeException("methodB() 出错了");
}
}
}
传播行为 | 含义 | 上例说明 | |
不要事务 | PROPAGATION_NEVER | A无事务,B非事务执行 A有事务,抛异常 | A不能有事务,A和B任何情况都不回滚 |
PROPAGATION_NOT_SUPPORTED | A无事务,B非事务执行 A有事务,A直接挂起,B非事务执行 | A有事务,A有异常自己回滚 | |
可有可无事务 | PROPAGATION_SUPPORTS | A有事务,B和A一起用事务 A无事务,B非事务执行 | A有事务,A和B其中一个有异常,都回滚 |
必须有事务 | PROPAGATION_REQUIRES_NEW | A不管有无事务,B都新建一个事务 A如果有事务,则A事务直接挂起 | A无事务,B有异常自己回滚 A有事务,A或B,谁异常谁回滚 |
PROPAGATION_NESTED | A无事务,B新建一个事务 A有事务,B在A中嵌套其他事务 | A无事务,B有异常自己回滚 A有事务:A异常,B无异常,A和B一起回滚;A无异常,B异常,只有B回滚 | |
PROPAGATION_REQUIRED | A无事务,B新建一个事务 A有事务,B加入A的事务 | A无事务,B有异常自己回滚 A有事务,A或B其中一个异常,都回滚 | |
PROPAGATION_MANDATORY | A无事务,抛异常 A有事务,B加入A的事务 | A必须有事务,A或B其中一个异常,都回滚 |
注意:挂起时注意死锁状况发生。