今天在学习Spring事务时,遇到了事务失效的情况。
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void buyBook(Integer bookId, Integer userId) {
//查询图书的价格
Integer price = bookDao.getPriceByBookId(bookId);
//更新图书的库存
bookDao.updateStock(bookId);
//更新用户的余额
bookDao.updateBalance(userId, price);
}
@Override
@Transactional
public void buyBooks(Integer[] bookIds, Integer userId) {
for (Integer bookId : bookIds) {
buyBook(bookId,userId);
}
}
当我调用buyBooks()时,由于我设置了buyBook()的传播行为为REQUIRES_NEW,理应开启一个新事务,挂起原来的事务。但结果却还是将buyBooks()作为事务执行了,并没有将buyBook()作为新事务执行。
原因分析:Spring 中的事务通常是通过代理实现的,即在运行时生成一个代理对象,用于管理事务。当你在同一个类中的方法调用另一个方法时,事务是不会被触发的。
解决方法:手动注入一个代理对象,通过代理对象调用该方法。?
@Autowired
private IBookService bookService;
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void buyBook(Integer bookId, Integer userId) {
//查询图书的价格
Integer price = bookDao.getPriceByBookId(bookId);
//更新图书的库存
bookDao.updateStock(bookId);
//更新用户的余额
bookDao.updateBalance(userId, price);
}
@Override
@Transactional
public void buyBooks(Integer[] bookIds, Integer userId) {
for (Integer bookId : bookIds) {
bookService.buyBook(bookId,userId);
}
}