本文主要是介绍SpringBoot 事务的属性rollbackFor 与 propagetion,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
rollbackFor介绍
默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。
@Override@Transactionalpublic void insert() {classesMapper.delete(1);//删除班级int n =1/0;//发送运行时异常,数据正常回滚//手动抛出异常数据不回滚//if(true){thow new Exceptiom("手动抛出异常");}testMapper.delete(1);//根据班级删除学生}
默认情况下 @Transactional 只会回滚运行时的异常,如果手动抛出一个异常,那么数据将不会发送回滚,因为他是手动抛出的。
可以通过rollbackFor属性进行配置,让手动抛出的异常也回滚。
@Override@Transactional(rollbackFor = Exception.class)public void insert() {//Exception表示异常类型,也可以指定其他的。// Exception表示出现所有异常都回滚数据}
propagetion介绍
事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
有两个方法,a方法调用了b方法,而这两个方法都配置了事务,这时候两个方法用的是同一个事务,
@Transactionalpublic void a(){test.b();}
@Transactionalpublic void b(){}
案例
@Transactionalpublic void b(){//记录日志代码....}
@Transactionalpublic void a(){try {//执行逻辑....int n=1/0;//发送异常}finally {//这时候并不会成功的记录日志 因为发生异常 回滚了 两个用的是同一个事务test.b(); //记录日志 }}
这时finally用的是同一个事务 因为try的代码导致事务回滚了,所以记录日志的方法没有执行成功。这时候可以使用
@Transactional(propagation = Propagation.REQUIRES_NEW) 表示额外开启一个新的事务,不管有没有try{}里面有没有发生异常互不影响。
@Transactional(propagation = Propagation.REQUIRES_NEW)public void b(){//记录日志代码....}
事务的传播行为
- REQUIRED 【默认值】需要事务,有则加入,无则创建新事务
- REQUIRES NEW 需要新事务,无论有无,总是创建新事务
- SUPPORTS 支持事务,有则加入,无则在无事务状态中运行
- NOT SUPPORTED 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
- MANDATORY 必须有事务,否则抛异常
- NEVER 必须没事务,否则抛异常
这篇关于SpringBoot 事务的属性rollbackFor 与 propagetion的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!