Java事务详解

fbb6d8ff376d4b04ab79be7667984a0e.gif一、事务的理解:

 

 

1、事务的特性:

 

  1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。

 

  2) 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

 

  3) 隔离性(isolation):一个事务的执行不能被其他事务所影响。

 

  4) 持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。

 

2、事务的定义:

 

  事务(Transaction):是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql server 能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

 

  事务通常是以begin transaction开始,以commit或rollback结束:

 

  Commint表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束。

 

  Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态。

 

3、事务的分类:

 

  自动提交事务:每条单独的语句都是一个事务。每个语句后都隐含一个commit。 (默认)

 

  显式事务:以begin transaction显示开始,以commit或rollback结束。

 

  隐式事务:当连接以隐式事务模式进行操作时,sql server数据库引擎实例将在提交或回滚当前事务后自动启动新事务。无须描述事物的开始,只需提交或回滚每个事务。但每个事务仍以commit或rollback显式结束。连接将隐性事务模式设置为打开之后,当数据库引擎实例首次执行下列任何语句时,都会自动启动一个隐式事务:alter table,insert,create,open ,delete,revoke ,drop,select, fetch ,truncate table,grant,update在发出commit或rollback语句之前,该事务将一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行以上任何语句时,数据库引擎实例都将自动启动一个新事务。该实例将不断地生成隐性事务链,直到隐性事务模式关闭为止。

 

二、Java JDBC事务机制:

 

  首先,我们来看看现有JDBC操作会给我们带来什么重大问题,比如有一个业务:当我们修改一个信息后再去查询这个信息,看是这是一个简单的业务,实现起来也非常容易,但当这个业务放在多线程高并发的平台下,问题自然就出现了,比如当我们执行了一个修改后,在执行查询之前有一个线程也执行了修改语句,这是我们再执行查询,看到的信息就有可能与我们修改的不同,为了解决这一问题,我们必须引入JDBC事务机制,其实代码实现上很简单,一下给出一个原理实现例子供大家参考:

 

复制代码

private Connection conn = null;  

private PreparedStatement ps = null;  

try {  

    conn.setAutoCommit(false); //将自动提交设置为false  

    ps.executeUpdate("修改SQL"); //执行修改操作  

    ps.executeQuery("查询SQL"); //执行查询操作                 

    conn.commit(); //当两个操作成功后手动提交  

} catch (Exception e) {  

    conn.rollback(); //一旦其中一个操作出错都将回滚,使两个操作都不成功  

    e.printStackTrace();  

}

复制代码

三、与事务相关的理论:

1、事务(Transaction)的四个属性(ACID)

  原子性(Atomic) 对数据的修改要么全部执行,要么全部不执行。

  一致性(Consistent) 在事务执行前后,数据状态保持一致性。

  隔离性(Isolated) 一个事务的处理不能影响另一个事务的处理。

  持续性(Durable) 事务处理结束,其效果在数据库中持久化。

 

2、事务并发处理可能引起的问题

 

  脏读(dirty read) 一个事务读取了另一个事务尚未提交的数据,

 

  不可重复读(non-repeatable read) 一个事务的操作导致另一个事务前后两次读取到不同的数据

 

  幻读(phantom read) 一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

 

  举例:事务A、B并发执行时:

 

  当A事务update后,B事务select读取到A尚未提交的数据,此时A事务rollback,则B读到的数据是无效的"脏"数据。

 

  当B事务select读取数据后,A事务update操作更改B事务select到的数据,此时B事务再次读去该数据,发现前后两次的数据不一样。

 

  当B事务select读取数据后,A事务insert或delete了一条满足A事务的select条件的记录,此时B事务再次select,发现查询到前次不存在的记录("幻影"),或者前次的某个记录不见了。

 

四、JDBC的事务支持:

 

  JDBC对事务的支持体现在三个方面:

 

1、自动提交模式(Auto-commit mode):

 

  Connection提供了一个auto-commit的属性来指定事务何时结束。

 

  (1)当auto-commit为true时,当每个独立SQL操作的执行完毕,事务立即自动提交,也就是说每个SQL操作都是一个事务。

 

  一个独立SQL操作什么时候算执行完毕,JDBC规范是这样规定的:

 

  对数据操作语言(DML,如insert,update,delete)和数据定义语言(如create,drop),语句一执行完就视为执行完毕。

 

  对select语句,当与它关联的ResultSet对象关闭时,视为执行完毕。

 

  对存储过程或其他返回多个结果的语句,当与它关联的所有ResultSet对象全部关闭,所有update count(update,delete等语句操作影响的行数)和output parameter(存储过程的输出参数)都已经获取之后,视为执行完毕。

 

  (2)当auto-commit为false时,每个事务都必须显示调用commit方法进行提交,或者显示调用rollback方法进行回滚。auto-commit默认为true。

 

  JDBC提供了5种不同的事务隔离级别,在Connection中进行了定义。

 

2、事务隔离级别(Transaction Isolation Levels)

  JDBC定义了五种事务隔离级别:

  TRANSACTION_NONE JDBC驱动不支持事务

  TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。

  TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。

  TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。

  TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。

 

3、保存点(SavePoint)

 

  JDBC定义了SavePoint接口,提供在一个更细粒度的事务控制机制。当设置了一个保存点后,可以rollback到该保存点处的状态,而不是rollback整个事务。

 

  Connection接口的setSavepoint和releaseSavepoint方法可以设置和释放保存点。

 

  JDBC规范虽然定义了事务的以上支持行为,但是各个JDBC驱动,数据库厂商对事务的支持程度可能各不相同。如果在程序中任意设置,可能得不到想要的效果。为此,JDBC提供了DatabaseMetaData接口,提供了一系列JDBC特性支持情况的获取方法。比如,通过DatabaseMetaData.supportsTransactionIsolationLevel方法可以判断对事务隔离级别的支持情况,通过DatabaseMetaData.supportsSavepoints方法可以判断对保存点的支持情况。

 

五、事务的使用:

 

  当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行的时,我们就应该为这多条语句定义一个事务。

 

    其中,银行转账这一事例,最能说明,使用事务的重要性了。

 

update from account set money=money-100 where name=‘a’;

update from account set money=money+100 wherename=‘b’;

//因为这时,两个账户的增减变化是在一起执行的。现实生活中这种类似于同步通信的例子还有很多,这里,不再赘述。

  当然,对于事务的编写,也是要遵守一定的顺序的:

 

  首先,设置事务的提交方式为非自动提交:conn.setAutoCommit(false);

 

  接下来,将需要添加事务的代码放入try catch块中。

 

  然后,在try块内添加事务的提交操作,表示操作无异常,提交事务。conn.commit();

 

  尤其不要忘记,在catch块内添加回滚事务,表示操作出现异常,撤销事务:conn.rollback();

 

  最后,设置事务提交方式为自动提交:conn.setAutoCommit(true);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据之LibrA数据库系统告警处理(ALM-12033 慢盘故障)

告警解释 系统每一秒执行一次iostat命令,监控磁盘I/O的系统指标,如果在60s内,svctm大于100ms的周期数大于30次则认为磁盘有问题,产生该告警。 更换磁盘后,告警自动恢复。 告警属性 告警ID 告警级别 可自动清除 1…

vue,react虚拟dom

Virtual DOM 前言 在传统的Web开发中,直接操作真实的DOM通常是一个昂贵且低效的操作。为了解决这个问题,Virtual DOM(虚拟DOM)被引入为一个中间层,允许开发者在内存中进行操作,从而避免频繁且不必要的真实D…

377. 组合总和 Ⅳ

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1: 输入:nums [1,2,3], target 4 输出:7 解释&#…

什么是代理IP池?真实测评IP代理商的IP池是否真实?

代理池充当多个代理服务器的存储库,提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务,而无需担心被检测或阻止的风险。代理池为各种在线活动(例如网页抓取、安全浏览等)提高后勤保障。 读完…

【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

“第六十七天”

各位,昨天查找子串的方法想起来了,就是那个KMP算法......自己理解都有点困难,还看看能不能想一下,确实很困难啊。 不要忘了toupper函数和tolower函数不是直接改变字符的大小写,而是返回对应的大小写的值,需…

文件上传 [ACTF2020 新生赛]Upload1

打开题目,发现是一道文件上传题目 随便上传个一句话木马上去 发现网站前端有白名单限制,只能上传含有jpg,png,gif的后缀文件 那我们便传个2.jpg的一句话木马上去,bp抓包 我们改成php文件后缀试试,发现重发…

JS对图片尺寸和DPI进行编辑修改(1寸照修改为2寸照)

各种报名都对照片有大小限制&#xff0c;鉴于这种情况&#xff0c;网上搜了后拼凑出了如下代码&#xff0c;用于解决1寸照片修改为2寸照片&#xff0c;同时将DPI修改为300&#xff0c;当然也可以根据自己的情况修改代码&#xff1a; HTML <input type"file" id&…

毕业设计项目:基于java+springboot的共享单车信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…

ABAP OpenSQL 分页处理

功能实现 在 ABAP 中&#xff0c;可以使用 OpenSQL 来实现分页功能。下面是一种实现分页的示例方法&#xff1a; 首先&#xff0c;定义一个内部表来存储查询结果数据&#xff1a; DATA lt_data TYPE TABLE OF your_data_type.然后&#xff0c;使用 SELECT 语句将数据查询到内…

Android 10.0 Settings 加载流程

一、系统设置首页 代码路径&#xff1a;packages/app/Settings/ 1 主界面加载&#xff1a; <!-- Alias for launcher activity only, as this belongs to each profile. --><activity-alias android:name"Settings"android:label"string/settings_la…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

【学习辅助】Axure手机时间管理APP原型,告别手机控番茄任务模板

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;时间管理、系统工具 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为「手机时间管理」APP原型&#xff0c;…

第二座山:万事万物的宇宙规律,一定是站在共赢才能实现

第二座山 真善 实现大众利益 破我执、破小钱关&#xff0c;破小情关&#xff0c;破小事关众生皆苦&#xff0c;十年的目的就是牺牲自己任何那些你的身外之物&#xff0c;它根本不可控 真善 实现大众利益 破我执、破小钱关&#xff0c;破小情关&#xff0c;破小事关 你今天…

Redis集群,你真的学会了吗?

目录 1、为什么引入集群 1.1、先来了解集群是什么 1.2、哨兵模式的缺陷 引入集群解决了什么问题 1.3、使用集群&#xff0c;如何存储数据 2、三种主流的分片方式【经典面试题】 2.1、哈希求余算法 2.1.1、哈希求余算法的介绍 2.1.2、哈希求余算法如何扩容 2.2、一致性…

C# 并发编程

C# 并发编程 前言 对于现在很多编程语言来说&#xff0c;多线程已经得到了很好的支持&#xff0c; 以至于我们写多线程程序简单&#xff0c;但是一旦遇到并发产生的问题就会各种尝试。 因为不是明白为什么会产生并发问题&#xff0c;并发问题的根本原因是什么。 接下来就让…

acwing算法基础之数学知识--筛法求<=n的所有质数

目录 1 基础知识2 模板3 工程化 1 基础知识 核心思想&#xff1a;把2~n中的非质数打上标记&#xff08;也即&#xff0c;筛掉&#xff09;&#xff0c;剩余的就是质数。 一般做法&#xff1a; int primes[N]; //存储所有的质数 int st[N]; //存储是否被排除 int cnt; int n;…

vcomp120.dll丢失怎么办?vcomp120.dll丢失的解决方法分享

vcomp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;下面我将为大家介绍四个修复vcomp120.dll丢失的方法。 一、使用dll修复程序修复 可以通过百度或许…

flink的副输出sideoutput单元测试

背景 处理函数中处理输出主输出的数据流数据外,也可以输出多个其他的副输出的数据流数据&#xff0c;当我们的处理函数有副输出时&#xff0c;我们需要测试他们功能的正确性&#xff0c;本文就提供一个测试flink副输出单元测试的例子 测试flink副输出单元测试 首先看一下处理…

基于SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…