1.PROPAGETION_REQUIRED(默认事务传播方式)
如果当前没有事务则创建一个新事物,如果有则直接加入
//progation_required 默认事务传播方式
@Transactional(propagation = Propagation.REQUIRED)
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
}
@Transactional(propagation = Propagation.REQUIRED)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
int a=1/0;
}
上述由于test方法加入了main方法里面的事务当test方法发生异常时,所有的插入操作都回滚了。
2.PROPAGETION_REQUIRES_NEW(需要新事务)
当前如果没有事务将创建一个事务,如果当前存在事务,还是会创建一个事务
@Transactional(propagation = Propagation.REQUIRED)
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
int a=1/0;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
}
main方法和test方法都存在事务,所以当main方法出现异常时,main方法将回滚,但不影响test方法,应该两者时不同的事务互不影响,所以结果只有test方法插入成功。
3.PORAGATION_SUPPORTS(支持事务)
如果当前不存在则不使用事务,存在事务则使用事务
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
int a=1/0;
}
上面main方法没有事务,test也没有有事务,当test发生异常时,两者都不会进行事务操作。所以结果时两个方法都成功执行插人操作
4.PROPAGATION_NOT_SUPPORTS(不支持事务)
如果当前存在事务,则将该事务挂起。
@Transactional(propagation = Propagation.REQUIRED)
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
int a=1/0;
}
上面main存在事务,当执行到test方法时,事务会挂起,所以test出现异常时,test不会回滚,main方法会回滚。结果只有test方法插入了。
5。PROPAGRTION_MANDATORY(强制执行事务)
如果当前没有事务的话,就会直接报异常。
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
}
@Transactional(propagation = Propagation.MANDATORY)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
int a=1/0;
}
mian没有事务,当执行到test方法时,会因为获取不到事务而直接报异常,所以结果是只有main插入成功。
6.PROPAGATION_NEVER(从来不使用事务)
如果当前有事务,就会直接报异常。
@Transactional(propagation = Propagation.REQUIRED)
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
}
@Transactional(propagation = Propagation.NEVER)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
int a=1/0;
}
main方法存在事务,当执行test方法时,会直接报异常,所以结果只有main方法插入成功。
7.PROPAGATION_NESTED(嵌套事务)
如果当前存在事务,则在嵌套事务(你可以简单理解就是原事务)中执行,但嵌套事务的执行不影响原事务,如果不存在,则创建一个新事务。
@Transactional(propagation = Propagation.REQUIRED)
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
}
@Transactional(propagation = Propagation.NESTED)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
int a=1/0;
}
mian方法存在事务,当test方法出现异常时,test方法会回滚,但不影响原事务(main方法里面的事务),所以结果只有main插入成功。
这个嵌套事务跟需要事务有什么区别,我在这直接放一段代码,同学们自己思考结果,只要你理解了上面就不难。
@Transactional(propagation = Propagation.REQUIRED)
public void main(){
BookTypes bookTypes = new BookTypes("1","1","1","1");
bookTypesDao.insert(bookTypes);
test();
int a=1/0;
}
@Transactional(propagation = Propagation.NESTED)
public void test(){
BookTypes bookTypes = new BookTypes("1","2","1","1");
bookTypesDao.insert(bookTypes);
}
这里再说一下事务失效问题:
1.再同一个类中,一个非事务方法条用一个事务方法,此时就会失效。因为事务是根据aop实现的,用容器获取的类其实是ioc创建的代理类,调用该类的test方法实际时调用被代理的类的test方法,而被代理的test方法调用的transAcounts()方法实际隐藏了 this,即调用的时this.transAcounts(),之后调用被代理的类的transAcounts方法,该方法没有被spring事务管理。
2.异常被捕获了
如果异常被捕获了,那么事务就检测不到异常自然不能触发事务管理。