Spring的基于注解的声明式事务,配置起来非常简单,但是使用的时候需要注意两点:
假设
public class AServiceImpl implements AService {
[......]
public void saveA(A a){
ADao.insertA(a);
}
}
1. @Transactional必须标注在入口方法上。如:
public class ADaoImpl extends BaseDao implements ADao {
@Transactional
public void insertA(A a){
insert("insert_a", a);
insert("insert_b", a.getB());
}
}
如果是下面这种,就会失效:
public class ADaoImpl extends BaseDao implements ADao {
public void insertA(A a){
insertAA(A a);
}
@Transactional
public void insertAA(A a){
insert("insert_a", a);
insert("insert_b", a.getB());
}
}
2.加上事务的方法必须抛出RuntimeException的子类,否则不会回滚,如果在上面的加了@Transactional的insertA里catch了数据库异常,并且没有抛出,则这个方法的事务不会回滚。