@Transactional 介绍  

  Spring 事务管理分为编码式和声明式的两种方式,编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。@Transactional属于声明式事务中(两种)的一种,另一种是通过在配置文件(xml)中做相关的事务规则声明。我这里就不解释@Transactional注解管理事务的实现步骤了,直接用项目实战的例子说明为什么要用到@Transactional。

需求说明

  公司项目中的合同表的信息是通过第三方接口传数据,我需要写一个合同数据的保存接口,合同表中有一个是合同主表,另一个是合同明细表,明细表中冗余了合同主表的id。对于数据的保存肯定得保证完整性,不能有遗漏,必须全部保存,如果保存的过程中有报错就不能执行保存操作,这时@Transactional就起到作用了,它能够保证合同信息及其明细信息完整的保存。

@Override
@Transactional(transactionManager = "userDataSourceTxManager")
public Long addSingleContractInfo(AddContractInfoReqDto addContractInfoReqDto) {
if(null==addContractInfoReqDto){
throw new BizException(ExampleExceptionCode.REQ_PARAM_NON_NULL.getMsg());
}
//保存合同主表信息
ContractEo contractEo = ContractEo.newInstance();
DtoHelper.dto2Eo(addContractInfoReqDto,contractEo);
contractEo.setUpdateTime(addContractInfoReqDto.getUpdateDate());
contractDas.insert(contractEo);
//保存合同商品详情信息
List<ContractItemDetailReqDto> itemDetailReqDtos = addContractInfoReqDto.getItemDetailReqDtoList();
itemDetailReqDtos.stream().forEach(dto->{
ContractItemDetailEo contractItemDetailEo= ContractItemDetailEo.newInstance();
DtoHelper.dto2Eo(dto,contractItemDetailEo);
//合同商品明细表中冗余主表id
contractItemDetailEo.setUsContractId(contractEo.getId());
contractItemDetailDas.insert(contractItemDetailEo);
});
return contractEo.getId();
}

注意事项

第二条红色标注的新建合同明细实体类代码必须写在里面,每次保存后都新建一个新的合同明细实体,如果写在外面的话就会报错

java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'.实体主键id重复了,这时如果你没在方法上加上@Transactional注解,虽然出现报错了,但是数据库还是会执行保存操作,只存入合同明细集合的第一条数据(后面的主键id重复了,不保存),造成数据保存不完整,加了@Transactional后,一但出现错误,就不会执行保存操作(事务的原子性)。

项目实战--@Transactional 的使用的更多相关文章

  1. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  2. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  3. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  4. Asp.Net Core 项目实战之权限管理系统(0) 无中生有

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. Asp.Net Core 项目实战之权限管理系统(5) 用户登录

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. Asp.Net Core 项目实战之权限管理系统(6) 功能管理

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. AcWing 380. 舞动的夜晚

    大型补档计划 题目链接 这题是求必须边,而不是不可行边,因为不可行边 = 必须边 + 死掉了的边(貌似lyd第三版书上还是说的不可行边)先跑最大流. 在跑完以后的残余网络上,对于一条当前匹配的边 \( ...

  2. 排序算法-Java实现快速排序算法

  3. .net5+nacos+ocelot 配置中心和服务发现实现

    最近一段时间 因公司业务需要,需要使用.net5做一套微服务的接口,使用nacos 做注册中心和配置中心,ocelot做网关. 因为ocelot 支持的是consol和eureka,如果使用nacos ...

  4. ant-design 基础格式

    1 格式 <template> <div> <center><h1>这是·注册页面</h1></center> <a-fo ...

  5. ORACLE启用非默认监听端口

    1.修改listener.ora文件 LISTENER_TEST =         (DESCRIPTION =                 (ADDRESS = (PROTOCOL = TCP ...

  6. RMAN迁移数据库(不改变文件目录)

    1.目标库创建相应目录mkdir -p /u01/app/oracle/oradata/orclmkdir -p /u01/app/oracle/fast_recovery_area/ORCLmkdi ...

  7. <UnityTheGreat><001>获取指定目录下指定类型的所有文件的名称

    #region Environment Windows 10 Unity 2019.4.16f1c1 LTS VSCode 1.52 https://github.com/MirzkisD1Ex0/U ...

  8. 用burp爆破tomcat的过程

    首先burp抓包,将抓到的包放到intruder中 通过burp中自带的解码得知账号密码中有个":"号 所以我们选择的数据类型为Custom iterator 第二条输入" ...

  9. 转载:从输入 URL 到页面加载完的过程中都发生了什么事情?

    原帖地址:http://www.guokr.com/question/554991/ 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP ...

  10. Matplotlib处理csv文件

    csv模块包含在python标准库中,可用于分析CSV文件中的数据行,让我们能够快速提取感兴趣的值.首先绘制一个简单的折线图: 1 #!usr/bin/env python 2 #*-*Coding= ...