1.在开发中通过@Transaction注解进行事务控制,如果当前方法抛出异常则自动回滚事务
@Transactional
public void addBook(Book book){
......
//数据库操作
bookDao.save(book);
//此处抛出异常则本方法的数据库操作全部回滚
shopDao.update(book);
......
}
2.如果方法中人为捕获了异常并且没有抛出异常则spring不会自动回滚
@Transactional
public void addBook(Book book){
......
//数据库操作
try{
bookDao.save(book);
//此处抛出异常则上面的数据库操作不会回滚
shopDao.update(book);
}catch(Exception e){
log.error("这里出异常了")
}
......
}
此种情况下如果想要回滚事务可以使用手动回滚的方式:
@Transactional
public void addBook(Book book){
......
//数据库操作
try{
bookDao.save(book);
//此处抛出异常则上面的数据库操作不会回滚
shopDao.update(book);
}catch(Exception e){
log.error("这里出异常了");
//手工控制数据库事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
......
}