@Transactional注解只能在public修饰的方法下使用,因为spring aop实现事务时,判断了当前代理方法是否为public修饰。
@Transactional
private boolean test(){
//do something
}
类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B
@Service
public class Demo {
public void A() {
this.B();
}
@Transactional
public void B() {
......
}
}
MySQL中,MyISAM存储引擎不支持事务,InnoDB支持事务
@Transactional注解默认处理运行时异常,非运行时异常需要通过rollbackFor属性指定。
/**
* 非运行异常,且没有通过 rollbackFor 指定抛出的异常,不生效
* @param id
* @return
* @throws Exception
*/
@Transactional
public boolean testException(int id) throws Exception {
//运行代码
throw new Exception("参数异常");
}
方法内部的异常通过try catch捕获并处理了,未抛出
@Transactional
public void A(){
try{
......
}catch(Exception e){
// 未抛异常
}
}
@Transactional默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTED、NEVER事务传播机制,则事物不生效