1、@Transactional注解只能在抛出RuntimeException或者Error时才会触发事务的回滚,常见的非RuntimeException是不会触发事务的回滚的。但是我们平时做业务处理时,需要捕获异常,所以可以手动抛出RuntimeException异常。
2、只有public修饰的方法才会生效。
3、方法内自调用导致的事务不生效
/*
* 情况一:都有事务注解,异常在子方法出现,事务生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
return result;
}
@Transactional
public Long add(Book book){
Long result = bookDao.addBook(book);
int i = 1/0;
return result;
}
/*
* 情况二:都有事务注解,异常在主方法出现,事务生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
int i = 1/0;
return result;
}
@Transactional
public Long add(Book book){
Long result = bookDao.addBook(book);
return result;
}
/*
* 情况三:只有主方法有事务注解,异常在子方法出现,事务生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
return result;
}
public Long add(Book book){
Long result = bookDao.addBook(book);
int i = 1/0;
return result;
}
/*
* 情况四:只有主方法有事务注解,异常在主方法出现,事务生效
*/
@Override
@Transactional
public Long addBook(Book book) {
Long result = add(book);
int i = 1/0;
return result;
}
public Long add(Book book){
Long result = bookDao.addBook(book);
return result;
}
/*
* 情况五:只有子方法有事务注解,异常在子方法出现,事务不生效
*/
@Override
public Long addBook(Book book) {
Long result = add(book);
return result;
}
@Transactional
public Long add(Book book){
Long result = bookDao.addBook(book);
int i = 1/0;
return result;
}
结论:当无事务方法调用有事务的方法时事务不会生效,而主方法有事务去调用其他方法,无论有无事务,且是否出现异常(有异常需要能够抛出不被捕获),都触发事务。