跳到主要内容

吃透Spring源码(二十三):事物传播特性

一,上篇源码总结

关于异常回滚:

1、 如果有保存点,回滚到保存点;
2、 否则,如果当前是一个新事物(transaction!=null&&newTransaction==true),直接进行回滚;
3、 否则,设置全局回滚标记,如果既没有保存点,又不是新的事务,如果可以设置全局的回滚标记的话,就会设置;

关于事物提交:

1、 如果在事务链中已经被标记回滚,那么不会尝试提交事务,直接回滚;
2、 如果设置了全局回滚,则进行全局回滚;
3、 如果是新事务(transaction!=null&&newTransaction==true),则直接提交;
4、 如果不是新事务不会提交,要等外层是新事务才提交;

二,事物传播特性

  • REQUIRED:如果有事物在运行,当前的方法就在这个事物内运行,否则,就启动一个新的事物,并在自己的事物内运行。
  • REQUIRED_NEW:当前方法必须启动新事物,并在自己的事物内运行。如果有事物正在运行,应该将它挂起。
  • SUPPORTS:如果有事物在运行,当前方法就在这个事物内运行,否则,它就不用事物。
  • NOT_SUPPORTS:当前的方法不应该运行在事物中,如果有事物正在运行,就将它挂起。
  • MANDATORY:当前方法必须运行在事物内部,如果没有正在运行的事物,就抛出异常。
  • NEVER:当前方法不应该运行在事物中,如果有事物正在运行,就抛出异常
  • NESTED:如果有事物在运行,当前的方法就应该在这个事物的嵌套事物内运行,否则,就启动一个新的事物,并在它自己的事物内运行。

 

三,传播特性测试

public class BookService {



@Autowired
BookDao bookDao;

public BookDao getBookDao() {


return bookDao;
}

public void setBookDao(BookDao bookDao) {


this.bookDao = bookDao;
}

/**
* 结账:传入哪个用户买了哪本书
* @param username
* @param id
*/
@Transactional(propagation = Propagation.REQUIRED)
public void checkout(String username,int id){


// 减库存
bookDao.updateStock(id);
}
}