对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事务基础概念及测试方法相关推荐

  1. java jdbc事务_Java JDBC事务管理和保存点

    java jdbc事务 Transaction Management in java is required when we are dealing with relational databases ...

  2. java JDBC事务和JTA事务详解

    什么是事务? 事务其实就是一套数据库操作集合,说到事务就不得不说它的四大特性(A C I D):原子性,一致性,隔离性,持久性.事务的原子性表示事务要么被全部执行,要么被全部不执行.如果事务下的子事务 ...

  3. Java JDBC事务与JTA分布式事务

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于 ...

  4. 一文看懂Java虚拟机——JVM基础概念整理

    1 基础概念 2 垃圾回收 3 虚拟机调优

  5. java类加载器正确的是_Java面试题:面向对象,类加载器,JDBC, Spring 基础概念

    1. 为什么说Java是一门平台无关语言? 平台无关实际的含义是"一次编写到处运行".Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无 ...

  6. java jdbc事务管理_hibernate事务管理 (jdbc jta)

    评论 # re: hibernate事务管理 (jdbc jta) 2007-07-29 10:18 pig JTA事务的开始 Transaction tx = session.beginTransa ...

  7. Java 面试题基础概念收集(高级)

    JVM垃圾回收: GC又分为 minor GC 和 Full GC (也称为 Major GC ).Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivor 区 ...

  8. java jdbc rowset_JAVA基础知识之JDBC——RowSet

    RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...

  9. 8.java中面向对象---基础概念(1)(附讲解与练习)

    学习面向对象内容的三条主线 1.Java类及类的成员 属性,方法,构造器,代码块,内部块 2.面向对象的三大特征 封装 (Encapsulation) 继承 (Inheritance) 多态 ( ...

最新文章

  1. python使用fpdf2包和pdfrw报包新内容添加到已有的PDF页面上
  2. 软件测试技术学什么条件,软件测试从业者需要具备哪些技能
  3. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第10章-一阶多智能体系统非合作行为检测与隔离
  4. 从Deepwalk到Node2vec
  5. rabbitmq 3.7.0+erlang 20.1 安装
  6. BAT人脸识别功能第二步-人脸检测
  7. .NET请求编译流程图(解释为什么第一次请求比较慢)
  8. 全网最详细的idea安装教程
  9. 软件外包中常见的七个错误之一 - 不懂用户需求
  10. 51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
  11. liunx开发板使用交叉网线连接电脑,通过电脑连接外网的方法
  12. android tv tts,android触摸语音事件
  13. 4 Bootstrap4组件——徽章(Badges)
  14. 名词解释:VG、PV、PP、LV、LP
  15. 用blender和MakeHuman生成人体动画
  16. Illumination与任天堂发布《超级马力欧兄弟大电影》首支预告片,影片将于2023年上映
  17. 云南烟草:科技引领财务变革 智能创造财务价值
  18. ssserver 总是自动退出的原因
  19. SQL--数据的过滤和分组
  20. JQData | 在个股回测中,如何才能避开新股的一字涨停?

热门文章

  1. 西门子博图指令(定时器操作二)
  2. 不动产数据整合技术方案
  3. 论微信抢红包与谁手气最佳的关系(微信红包matlab实现)
  4. Android Studio Chipmunk Patch 2(android-studio-2021.2.1.16)下载地址
  5. I06-python菜鸟教程查漏补缺
  6. 让电脑读懂你的语言——如何理解 Word2Vec
  7. matlab拟合伽玛曲线,HDR详解 - 伽玛曲线
  8. 19、费用管理的报销业务:从单据字段看业务
  9. 算法题21 最快过桥问题
  10. Java Web之过滤器(Filter)