JAVA-JDBC事务基础概念及测试方法
对java-JDBC事务的基本理解
事务:原子操作单元,比如从数据库角度,就是一组SQL指令,要么全部执行成功,若其中一条SQL执行失败,则自动撤销(回滚)已经执行成功的SQL,总结来说是:要么全部执行成功,要么回滚不执行。
数据库事务的实现是通过java程序,所以数据库事务也可以称之为java事务。
PS:Java中使用事务处理,首先要求数据库支持事务。如使用MySQL的事务功能,就要求MySQL的表类型为Innodb才支持事务。否则,在Java程序中做了commit或rollback,但在数据库中根本不能生效。
事务的特性
原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚;
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态;
隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离;
持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
为什么需要事务?
事务是为解决数据安全操作及正确性提出的,事务控制实际上就是控制数据的安全访问,保证数据的正确性。
事务实现的简单事实例
退款场景的模拟,退款操作一般需要完成两张表的状态更新,订单表和退款流水表,流程一般是发起退款时,订单表状态更新为退款处理中,退款流水表入库一条数据,然后,程序进行其他的校验操作,比如风控,若风控校验未通过,那么退款将失败,此时退款表需要将状态更新为失败状态,订单表因退款失败,则需要回滚为支付成功未退款的状态;
那么,事务的作用就明显的展现出来了,如果不使用事务,会出现两张表状态不同步的情况,再次发起退款时会导致失败,事务的处理,保证了两张表状态的同步性,数据的一致性。
/*** 退款,风控校验未通过,流水表状态U更新为F,订单表R1回滚为S,事务处理
*/@Transactional(rollbackFor = Exception.class)public void updatePayOrdInfoAndRefund(PayOrderInfo payOrderInfo, RefundOrderInfo refundOrderInfo, TradeRiskCtrlResp tradeRiskCtrlResp) {int result = payOrderInfoMapper.updateRiskResult(tradeRiskCtrlResp.getMsgInf(), tradeRiskCtrlResp.getMsgCd(), PayOrderInfoStsEnum.R1.getStatus(), PayOrderInfoStsEnum.S.getStatus(), payOrderInfo.getOrdNo());if (result == 0) {throw new UnexpectedRollbackException("PayOrderInfo更新表异常");}result = refundOrderInfoMapper.updateRiskResult(tradeRiskCtrlResp.getMsgInf(), tradeRiskCtrlResp.getMsgCd(), RefundOrderInfoStsEnum.U.getStatus(), RefundOrderInfoStsEnum.F.getStatus(), refundOrderInfo.getRfdOrdNo());if (result == 0) {throw new UnexpectedRollbackException("refundOrderInfo表入库异常");}}
对于JDBC事务的测试方法
1、通过设置延时并更改数据进行测试
在两张表数据进行更新操作的中间增加延时等待时间,在等待时,手动update第二张表的数据为异常,然后关注结果,第一张表的状态是否正确回滚。
2、通过debug模式进行测试
启动服务,开启debug模式,在第二张表进行更新操作前,手动update第二张表的数据为异常,然后关注结果,第一张表的状态是否正确回滚。
3、单测
测试类代码中模拟操作第二张表时抛出异常,关注事务对第一张表的处理。
JAVA-JDBC事务基础概念及测试方法相关推荐
- java jdbc事务_Java JDBC事务管理和保存点
java jdbc事务 Transaction Management in java is required when we are dealing with relational databases ...
- java JDBC事务和JTA事务详解
什么是事务? 事务其实就是一套数据库操作集合,说到事务就不得不说它的四大特性(A C I D):原子性,一致性,隔离性,持久性.事务的原子性表示事务要么被全部执行,要么被全部不执行.如果事务下的子事务 ...
- Java JDBC事务与JTA分布式事务
Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于 ...
- 一文看懂Java虚拟机——JVM基础概念整理
1 基础概念 2 垃圾回收 3 虚拟机调优
- java类加载器正确的是_Java面试题:面向对象,类加载器,JDBC, Spring 基础概念
1. 为什么说Java是一门平台无关语言? 平台无关实际的含义是"一次编写到处运行".Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无 ...
- java jdbc事务管理_hibernate事务管理 (jdbc jta)
评论 # re: hibernate事务管理 (jdbc jta) 2007-07-29 10:18 pig JTA事务的开始 Transaction tx = session.beginTransa ...
- Java 面试题基础概念收集(高级)
JVM垃圾回收: GC又分为 minor GC 和 Full GC (也称为 Major GC ).Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivor 区 ...
- java jdbc rowset_JAVA基础知识之JDBC——RowSet
RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...
- 8.java中面向对象---基础概念(1)(附讲解与练习)
学习面向对象内容的三条主线 1.Java类及类的成员 属性,方法,构造器,代码块,内部块 2.面向对象的三大特征 封装 (Encapsulation) 继承 (Inheritance) 多态 ( ...
最新文章
- python使用fpdf2包和pdfrw报包新内容添加到已有的PDF页面上
- 软件测试技术学什么条件,软件测试从业者需要具备哪些技能
- 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第10章-一阶多智能体系统非合作行为检测与隔离
- 从Deepwalk到Node2vec
- rabbitmq 3.7.0+erlang 20.1 安装
- BAT人脸识别功能第二步-人脸检测
- .NET请求编译流程图(解释为什么第一次请求比较慢)
- 全网最详细的idea安装教程
- 软件外包中常见的七个错误之一 - 不懂用户需求
- 51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
- liunx开发板使用交叉网线连接电脑,通过电脑连接外网的方法
- android tv tts,android触摸语音事件
- 4 Bootstrap4组件——徽章(Badges)
- 名词解释:VG、PV、PP、LV、LP
- 用blender和MakeHuman生成人体动画
- Illumination与任天堂发布《超级马力欧兄弟大电影》首支预告片,影片将于2023年上映
- 云南烟草:科技引领财务变革 智能创造财务价值
- ssserver 总是自动退出的原因
- SQL--数据的过滤和分组
- JQData | 在个股回测中,如何才能避开新股的一字涨停?