网站建设模块怎样划分深圳排名seo
news/
2025/9/27 14:39:47/
文章来源:
网站建设模块怎样划分,深圳排名seo,开展门户网站建设,SEO案例网站建设1.3 事务进阶
前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性#xff1a; 异常回滚的属性#xff1a;rollbackFor 事…1.3 事务进阶
前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性 异常回滚的属性rollbackFor 事务传播行为propagation
我们先来学习下rollbackFor属性。
1.3.1 rollbackFor
我们在之前编写的业务方法上添加了Transactional注解来实现事务管理。
Transactional
public void delete(Integer id){//根据部门id删除部门信息deptMapper.deleteById(id);//模拟异常发生int i 1/0;
//删除部门下的所有员工信息empMapper.deleteByDeptId(id);
}
以上业务功能delete()方法在运行时会引发除0的算数运算异常(运行时异常)出现异常之后由于我们在方法上加了Transactional注解进行事务管理所以发生异常会执行rollback回滚操作从而保证事务操作前后数据是一致的。 下面我们在做一个测试我们修改业务功能代码在模拟异常的位置上直接抛出Exception异常编译时异常
Transactional
public void delete(Integer id) throws Exception {//根据部门id删除部门信息deptMapper.deleteById(id);//模拟异常发生if(true){throw new Exception(出现异常了~~~);}
//删除部门下的所有员工信息empMapper.deleteByDeptId(id);
} 说明在service中向上抛出一个Exception编译时异常之后由于是controller调用service所以在controller中要有异常处理代码此时我们选择在controller中继续把异常向上抛。 DeleteMapping(/depts/{id})
public Result delete(PathVariable Integer id) throws Exception {
//日志记录
log.info(根据id删除部门);
//调用service层功能
deptService.delete(id);
//响应
return Result.success();
} 重新启动服务后测试
抛出异常之后事务会不会回滚 现有表中数据 使用postman测试删除5号部门 发生了Exception异常但事务依然提交了 dept表中数据 通过以上测试可以得出一个结论默认情况下只有出现RuntimeException(运行时异常)才会回滚事务。
假如我们想让所有的异常都回滚需要来配置Transactional注解当中的rollbackFor属性通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。
Slf4j
Service
public class DeptServiceImpl implements DeptService {Autowiredprivate DeptMapper deptMapper;
Autowiredprivate EmpMapper empMapper;
OverrideTransactional(rollbackForException.class)public void delete(Integer id){//根据部门id删除部门信息deptMapper.deleteById(id);//模拟异常发生int num id/0;
//删除部门下的所有员工信息empMapper.deleteByDeptId(id); }
} 接下来我们重新启动服务测试删除部门的操作 控制台日志执行了删除3号部门的操作 因为异常又进行了事务回滚 数据表3号部门没有删除 结论 在Spring的事务管理中默认只有运行时异常 RuntimeException才会回滚。 如果还需要回滚指定类型的异常可以通过rollbackFor属性来指定。 1.3.3 propagation
1.3.3.1 介绍
我们接着继续学习Transactional注解当中的第二个属性propagation这个属性是用来配置事务的传播行为的。
什么是事务的传播行为呢 就是当一个事务方法被另一个事务方法调用时这个事务方法应该如何进行事务控制。 例如两个事务方法一个A方法一个B方法。在这两个方法上都添加了Transactional注解就代表这两个方法都具有事务而在A方法当中又去调用了B方法。 所谓事务的传播行为指的就是在A方法运行的时候首先会开启一个事务在A方法当中又调用了B方法 B方法自身也具有事务那么B方法在运行的时候到底是加入到A方法的事务当中来还是B方法在运行的时候新建一个事务这个就涉及到了事务的传播行为。 我们要想控制事务的传播行为在Transactional注解的后面指定一个属性propagation通过 propagation 属性来指定传播行为。接下来我们就来介绍一下常见的事务传播行为。
属性值含义REQUIRED【默认值】需要事务有则加入无则创建新事务REQUIRES_NEW需要新事务无论有无总是创建新事务SUPPORTS支持事务有则加入无则在无事务状态中运行NOT_SUPPORTED不支持事务在无事务状态下运行,如果当前存在已有事务,则挂起当前事务MANDATORY必须有事务否则抛异常NEVER必须没事务否则抛异常… 对于这些事务传播行为我们只需要关注以下两个就可以了 REQUIRED默认值 REQUIRES_NEW
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919592.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!