JDBC事务之理论篇
事务:
事务是数据库操作的基本逻辑单位,一般来说,事务总是并发地执行,并且这些事务可能并发地存取相同的数据。因此为了保证数据的完整性和一致性,所有的JDBC相符的驱动程序都必须支持事务管理。
事务可以理解成 一个操作的序列,Mysql中的事务处理:它是由一个或者多个SQL语句序列结合在一起形成所形成的逻辑处理单元。事物处理中的每一条语句都是完成数据库整个操作任务的一部分,所有的SQL语句结合在一起执行完毕,才能达到完成指定的目的。DBMS在对事务处理中的语句进行处理时,是按照一个约定成俗的规定进行处理的:事务处理中的所有语句都将被作为一个原子性的工作单位,所有语句要么成功的一起执行,要么一个也不执行。
事务本身具有ACID的属性。ACID就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性( Atomicity):是事务的最小单元,是不可在分割的单元,相当于一个个小的数据库操作,这些操作必须同时成功才为成功,只要有一个失败,则一切的操作都将失败,这就是原子性。
一致性(Consistency):事务在系统完整性中实施一致性,通过保证系统的任何事务最后都处于有效状态来实现。如果事务操作成功,那么系统的所有变化将正确的应用于系统中,系统处于有效状态。如果事务操作中出现错误,那么系统中的所有事务将自动的发生回滚,返回到操作前的状态来保持系统的一致性。
隔离性(Isolation):在隔离的状态执行事务,使它们觉得好像是系统在某一个给定的时间段内执行唯一的操作,如果有两个事务,运行在相同的时间段内,执行着相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用这个系统。
在JDBC中,所有的事务操作都是在Connection对象级别上处理的。Connection是什么?可以说是和数据库的一次对话~ 当事务操作完成时,可以通过调用Commit()方法将其最终化。
如果事务中有异常终止,则可以调用rollback()来撤销事务中的操作。
除了commit()和rollBack,MySQL还支持几种事务命令:
1:begin:启动事务相当于执行Start Transaction. (好像一般不用手动)
2:Start Transaction:启动事务. (好像一般不用手动)
3:set autocommit=0/1:为0代表取消自动提交处理,开启事务处理;为1代表打开自动提交处理,关闭事务处理,系统默认情况为1.
4:commit:提交事务.
5:rollback:回滚全部事务.
6:savepoint 事务保存点的名称:设置事务保存点.
7:rollback to savepoint 保存点名称:回滚操作到设置的保存点。
讲几个重点,JDBC中,事务管理的默认方式是“自动提交”,也就是当执行完某个新操作之后,系统将自动调用commit()方法。即每个更新操作都呗当作独立的事务执行。所以要自己管理事务或者进行事务管理的时候,一定要先
con.setAutoCommit(false); //默认设的是true
噢有一点要记一下,就connect在执行close的时候会执行一次commit()
savepoint提供了回滚部分事务的机制。保存点是检查点,当事务操作发生异常时,可以通过设置保存点,将事务回滚到保存点并从该点继续执行。
可以使用Connection的 setSavePoint() 方法创建保存点,然后运行Connection类的 rollBack(savepointName)
事务隔离级别:
事务隔离级别是用来指定哪些数据对事务中的语句是可视的。
先看当多个事务视图访问相同的的数据时,所可能有的情况:
1.脏读取:
当一个事务修改了某一行数据而未提交,而另一个事务读取了该数据行的值。倘若前一个事务发生了回滚,则后一个事务将得到一个无效的值,这就是所谓的变脏。
(说明提交可以理解是对刚刚所做的这个操作的一个总结,结束的标志,并不是说提交后数据库才有改变,提交前数据库就已经变了。)(后面有隔离级别改善这个)
2.不可重复读取:
当一个事务在读取某一数据行时,另一个事务同时在修改此数据行,则前一事务在重复读取该数据行时将得到一个不一致的值。
3.幻象读取:
当一个事务在进行数据查询时,另一个事务恰好插入了满足查询条件的数据行,则前一个事务在重复读取满足条件的值时,将得到一个额外的值,这就是所谓幻象。
为了解决这些由于多个用户请求相同数据而引起的问题,事务之间必须使用锁相互隔开。多数主流数据库支持不同类型的锁,因此JDBC支持不同类型的事务,它们由Connection对象的setTransactionIsolation()方法指定。在JDBC API中可以获得下列事务级别:
(1)static interesting TRANSACTION_NONE = 0 这是一个特殊的常量,表示JDBC驱动不支持事务。
(2)TRANSACTION_READ_UNCOMMITTED = 1 此级别允许事务查看对数据所做的未提交更改。在此级别,脏读取、不可重复读取和幻象读取都是有可能的。
(3)TRANSACTION_READ_COMMITTED = 2 此级别表示在提交事务之前,在该事务中所做的任何更改在该事务之外都不可视。 这杜绝了脏读取的可能性。
(4)TRANSACTION_REPEATABLE_READ = 3 刺激被表示将读取的行锁定,从而使另一个事务在此事务完成之前不可能更改这些行,这将禁止脏读取和不可重复读取。幻象读取还是有可能的。
(5)TRANSACTION_SERIALIZABLE = 4 在事务期间将表锁定,从而使其他对表添加值或者出去值的事务不能更改WHERE条件,这将杜绝所有类型的数据反常。
运行在TRANSACTION_SERIALIZABLE模式下的事务可以保证最高程度的数据完整性和一致性,但事务保护的级别越高,性能损失就越大。
当创建Connection对象的时候,其事务隔离级别取决于驱动程序,但通常是所涉及的数据库的默认值。用户可以通过setTranctionIsolation()的方法来更改事务的隔离级别。新的级别会在连接过程的剩下时间里面生效。 如果只是想改变一个事务的隔离级别,则必须在该事务开始前进行设置,并在该事务结束后进行复位。不过不建议在事务途中对事务的级别进行更改。
JDBC事务之理论篇的更多相关文章
- JDBC事务之例子篇
上一篇随笔记了一些有关JDBC事务管理的理论知识.这篇来看例子(主要怕一篇随笔装所有东西太长了然后分开呵呵) 一般讲事务管理的,都是拿转钱来当例子的,嗯没错我们这也是. 这个是数据库中的t_accou ...
- CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)
JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...
- SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...
- 14 微服务电商【黑马乐优商城】:day01-springboot(理论篇)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) :day01-springboot(Thyme ...
- 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇二:知道什么是SpringCloud)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一: ...
- Java的JDBC事务详解(转)
事务的特性: 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行. 2) 一致性(consistency):事务在完 ...
- Java中的事务——JDBC事务和JTA事务
Java中的事务——JDBC事务和JTA事务 转载:http://www.hollischuang.com/archives/1658 之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中 ...
- Java的JDBC事务详解
Java的JDBC事务详解 分类: Hibernate 2010-06-02 10:04 12298人阅读 评论(9) ...
- Oracle知识梳理(一)理论篇:基本概念和术语整理
理论篇:基本概念和术语整理 一.关系数据库 关系数据库是目前应用最为广泛的数据库系统,它采用关系数据模型作为数据的组织方式,关系数据模型由关系的数据结构,关系的操作集合和关系的完整 ...
随机推荐
- 闪动的Label控件
带闪动效果带控件,目前只有Label,以后会逐步增加,如果有好看带效果也欢迎您带加入. 如果可能,请在github中star,您的支持是我继续完善的动力,非常感谢. 测试环境:Xcode 5.0,iO ...
- 【概念】SVG(2)
Style <svg width="200" height="200" xmlns="http://www.w3.org/2000/svg&qu ...
- <编程>比较两种素数表生成算法+计算程序运行时间+通过CMD重定向测试程序
最近学习加密算法,需要生成素数表,一开始使用简单的循环,从2开始判断.代码如下: #include<iostream> #include<cstdio> #include< ...
- 51nod1674:区间的价值2(分治,利用&和|的收敛性)
lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2 ...
- HDU2147 kiki's game (SG表找规律)
Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes th ...
- 操作 AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(六)
自动化操作的稳定性,便利性虽然已经满足了要求,但是页面上呈现的按钮太多了,可以做的更加简单一些. 1. 简化页面的按钮,把5个按钮减少至3个,把Display HID按钮功能整合到create lic ...
- AtCoder Grand Contest 014 E:Blue and Red Tree
题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_e 题目翻译 有一棵有\(N\)个点的树,初始时每条边都是蓝色的,每次你可以选择一条由蓝色边构 ...
- dos窗口的乱码问题
1.在dos窗口上输入chcp 65001 2.然后右键属性选择字体
- bzoj4833
$数论$ $这个题已经忘了怎么做了,也不想知道了,只记得看了3个小时$ $对于有gcd(f_i, f_j) = f_{gcd(i, j)}性质的数列,以下结论适用$ #include<bits/ ...
- bzoj4521
数位dp 复习数位dp 数位dp一般用记忆化搜索来解决 观察需要满足的条件,然后计入状态 状态还要记录是否达到上线,以及前导零 比如说这道题 dfs(bit,a4,a8,cnt,last,limit) ...