Java的JDBC事务详解

事务的特性:1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。2) 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。3) 隔离性(isolation):一个事务的执行不能被其他事务所影响。4) 持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。事务(Transaction):是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql server 能将逻辑相关的一组操作绑定在一起,以便服务器 保持数据的完整性。事务通常是以begin transaction开始,以commit或rollback结束。Commint表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束。Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态。自动提交事务:每条单独的语句都是一个事务。每个语句后都隐含一个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的属性来指定事务何时结束。
a.当auto-commit为true时,当每个独立SQL操作的执行完毕,事务立即自动提交,也就是说每个SQL操作都是一个事务。
一个独立SQL操作什么时候算执行完毕,JDBC规范是这样规定的:
对数据操作语言(DML,如insert,update,delete)和数据定义语言(如create,drop),语句一执行完就视为执行完毕。
对select语句,当与它关联的ResultSet对象关闭时,视为执行完毕。
对存储过程或其他返回多个结果的语句,当与它关联的所有ResultSet对象全部关闭,所有update count(update,delete等语句操作影响的行数)和output parameter(存储过程的输出参数)都已经获取之后,视为执行完毕。
b. 当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方法可以判断对保存点的支持情况。

 

转载于:https://www.cnblogs.com/xiaolei2017/p/7920681.html

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

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

相关文章

HashMap中最多只允许一条记录的键为Null,允许多条记录的值为Null

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复会覆盖),但允许值重复。 Hashmap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时&#…

nfs文件系統

nfs 配置:使用NFS系统服务,至少需要启动以下3个系统守护进程。 1.rpc.nfsd 2.rpc.mountd 3.portmap NFS系统服务器端文件系统的共享设置有三种方法1.直接修改/etc/exports文件2.用exports命令来增加和删除目录3.使用图形化的配置方法 NFS系统服务客户端配…

ORA-12154: TNS:could not resolve the connect identifier specified. Solved.

进入系统属性页面 rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3 并添加系统环境变量 ORACLE_HOME ${path} TNS_ADMIND ${path}\network\admin NLS_LANG AMERICAN_AMERICA.ZHS16GBK 其中${path} 从http://www.oracle.com/technetwork/topics/winx64soft-089540.…

敏捷个人: 使用必须、应该、可以来确定每天事情的优先级

你的结果:对事情安排有先后意识,当任务列表出来之后,采用【必做、该做、可做】方法来划分事情优先级,这样可以让自己把精力和时间投入到更有价值的事情上;另外还可以让自己有一个取舍临时事件的方法 必须、应该、可以 …

[技术分享]20171130_Kendo UI _ datePicker日期控件如何只选择年,不选择月,日?

datePicker日期控件是很常用的控件,可以使用 start , depth来控制取值的范围。 start ,depth可以选择的参数有month,year,decade ,century 。 如何要只选择年:我们要用参数 decade ,…

LinkedHashMap的使用

LinkedHashMap LinkedHashMap是HashMap的一个子类; LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的; 在遍历的时候会比HashMap慢,不过有种情况例外,当H…

摩托罗拉:未来一切以手机为中心

人类有计算机以来,计算工具曾经是强大的计算机,个人电脑的出现,PC不但是重要计算的工具,同时它是互联网终端,改写了人类工作和生活的格局。未来的计算会是往什么方向发展,移动互联网成为人们关注的焦点&…

JQuery中this指向

如果是元素操作&#xff0c;$(this)就可以指向当前元素 <div id"test">谢小超</div> <script type"text/javascript">$("test").on(click,function(){var x $(this).html();alert(x);}) </script> 如果是方法&#xff0…

com 对象与其基础 rcw 分开后就不能再使用_如何使用 Kubeflow 机器学习流水线

作者&#xff1a;George Novack翻译&#xff1a;Bach&#xff08;才云&#xff09;校对&#xff1a;星空下的文仔&#xff08;才云&#xff09;、bot&#xff08;才云&#xff09;为什么要使用机器学习流水线现在&#xff0c;机器学习流水线&#xff08;Machine Learning Pipel…

在XenApp如何发布SAP的客户端(上)

随着越来越多的企业使用SAP&#xff0c;如何让让外地办事处以及供应商使用SAP已经不再IT经理的烦恼&#xff1f;作为应用虚拟化的王者&#xff0c;Citrix XenApp当之无愧。 首先我们需要了解SAP的基本信息&#xff0c; 1、 SAP的配置文件存储以下四个文件中 SAPlogon.ini …

《Sibelius 脚本程序设计》连载(四十二) - 4.12 Selection

《Sibelius 脚本程序设计》连载(Flash 格式) 转载于:https://www.cnblogs.com/Sibelius/archive/2011/01/08/1930896.html

markdown一边写一边预览_markdown文章编辑利器-基础篇

John Gruber(约翰-格鲁伯)创造了一个简单的语法&#xff0c;却是文章笔记的编辑利器&#xff0c;看看他是怎么做的吧。约翰君一天躺在床上正在思考着给烦人的老总提交会议笔记&#xff0c;一边写一边碎碎念&#xff0c;让我写会议笔记还不如让我写代码。约翰君越想越气&#xf…

【C#】解析C#中JSON.NET的使用

目录结构&#xff1a; contents structure [-]JSON.NET简介Serializing and Deserializing JSONJson ConvertJson SerializerLINQ TO JSONConverting XMLConvert JSON to XMLConvert XML to JSON原文链接JSON.NET对于.NET来说是一个非常高效的JSON框架。 1. JSON.NET的简介 使用…

用手动和自动分别实现使用其DVD安装盘作为本地yum源

一、手动配置使用dvd作为yum源1、mkdir /media/cdrom #创建挂载点2、mount /dev/cdrom /media/cdrom #挂载光盘3、rpm -qa |grep yum #查看有没有yum4、…

android闹钟唤醒不准的原因_俄罗斯睡眠专家:闹钟铃声选错了,可能扰乱你的内分泌...

对不少人来说&#xff0c;起床是件和天性对抗的事。而“自然醒”和“被闹钟吵醒”&#xff0c;完全是两种不同的睡眠体验。近日&#xff0c;俄罗斯一项新研究指出&#xff0c;错误的闹铃声可能给健康带来负面影响。《生命时报》结合研究采访专家&#xff0c;解读闹铃声对身体的…

软件工程个人作业01

|小学生四则运算| 设计思想&#xff1a; 1 程序生成数据&#xff0c;并存到数据库Mysql; 2用户输入数据 3程序接收数据&#xff0c;并判断数据 4返回信息。 源程序代码&#xff1a; java文件 package pers.sun.operateion;//产生一个算式&#xff0c;及相应的结果public class …

db设计专用excel_工程师必备:硬件EMC设计规范

一引言广义的电磁兼容控制技术包括抑制干扰源的发射和提高干扰接收器的敏感度&#xff0c;我们都知道干扰源、干扰传输途径和干扰接收器是电磁干扰的三要素&#xff0c;同时EMC也是围绕这些问题进行研究&#xff0c;而运用最为广泛的抑制方法是屏蔽、滤波和接地&#xff0c;用它…

快速手动替换 Windows 7 系统字体

自从发现 GDI 这个能把 Windows 字体显示效果变得更平滑的软件之后&#xff0c;就欲罢不能了。借用网上的一张图片&#xff08;来源未知&#xff09;&#xff0c;对比了 Windows 标准、Windows Cleartype、GDI 和 Mac OS 四种情况下的字体效果&#xff0c;很明显 GDI 的效果非常…

使用说明 思迅收银系统_便利店收银使用的收银系统应该取决于什么?

生活中&#xff0c;我们常见的便利店规模可大可小&#xff0c;比如最小就十平米&#xff0c;大的话也有可能会好几百平米&#xff0c;有些人疑惑&#xff0c;到底便利店该不该使用收银系统&#xff0c;又或者该如何选择合适的收银系统。其实&#xff0c;不管如何&#xff0c;只…

MFC+GDI+绘制出雷达余晖效果

MFCGDI绘制出雷达余晖效果 1.首先要画出静态的坐标轴&#xff0c;用双缓冲方法在onpain消息中绘制。绘制方法都比较简单。声明一个内存DC&#xff0c;绘制一个圆形&#xff0c;再把坐标轴画上去。 void CDlg_RadarScanning::OnPaint() {CPaintDC dc(this); // device context …