资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
目 录1.事务概念.2 2.事务的 4 个特性 .2 2.1.原子性(Atomic).2 2.2.一致性(Consistency).2 2.3.隔离性(Isolation).2 2.4.持久性(Duarability).2 3.数据并发问题.3 3.1.脏读(Dirty Read).3 3.2.不可重复读(Unrepeatable Read).3 3.3.虚读/幻象读(Phantom read).3 3.4.第一类更新丢失.3 3.5.第二类更新丢失.3 4.数据库锁机制.3 4.1.按锁的作用范围分类.4 4.1.1.行级锁/行锁定.4 4.1.2.表级锁/表锁定.4 4.2.按锁的排他性分类.4 4.2.1.共享锁 .4 4.2.2.独占锁(排他锁).4 4.3.Oracle 常用的 5 种锁定 .4 4.3.1.行共享锁.4 4.3.2.行独占锁.4 4.3.3.表共享锁.4 4.3.4.表独占锁.4 4.3.5.表共享行独占锁.5 4.4.Oracle 常用的 5 种锁定对比 .5 5.事务隔离级别.5 5.1.TRANSACTION_NONE.6 5.2.TRANSACTION_READ_UNCOMMITTED.6 5.3.TRANSACTION_READ_COMMITTED.6 5.4.TRANSACTION_REPEA TABLE_READ.6 5.5.TRANSACTION_SERIALIZABLE.6 6.Java 事务类型.6 6.1.JDBC 事务.6 6.2.JTA(Java Transaction API)事务.7 6.3.容器事务 .7 7.分布式事务 .7 8.事务日志.8 9.事务回滚.8 10.悲观锁 .8 11.乐观锁 .9 12.Spring 事务 .9 12.1.事务隔离.9 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 12 页 -第 1 页12.2.事务传播.9 12.3.事务超时.10 12.4.只读状态.10 13.Hibernate 事务.10 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 12 页 -第 2 页1.事务概念“一荣俱荣,一损俱损”这句话很能体现事务的思想,很多复杂的事物要分步进行,但它们组成一个整体,要么整体生效,要么整体失效。这种思想反映到数据库上,就是多个SQL 语句,要么所有执行成功,要么所有执行失败。2.事务的 4 个特性数据库事务有严格的定义,它必须同时满足4 个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Duarability),简称ACID。2.1.原子性(Atomic)表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交,事务中任何一个数据库操作失败,已经执行的任何操作都必须撤销,让数据库返回到初始状态。事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。2.2.一致性(Consistency)事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏,如从 A 账户转账100 元到 B 帐户,不管操作成功与否,A 和 B 的存款总额是不变的。2.3.隔离性(Isolation)在并发数据操作时,不同的事务拥有各自的数据空间,它们的 操作不会对对方产生干扰。准确地说,并非要求做到完全无干扰,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱。多个事务并发执行时,一个事务的执行不应影响其他事务的执行。2.4.持久性(Duarability)一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中,即使提交名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 12 页 -第 3 页事务后,数据库马上崩溃,在数据库重启时,也必须能保证能够通过某种机制恢复数据。一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。3.数据并发问题3.1.脏读(Dirty Read)事务 A 读到事务B 尚未提交的数据,并基于这个数据进行后续操作。3.2.不可重复读(Unrepeatable Read)事务 A 读取数据后,被事务B 修改或删除,事务A 再次读取时前后两次读取的数据不一致。3.3.虚读/幻象读(Phantom read)事务 A 读取数据后,事务B 新增了数据,事务A 再次读取是前后两次读取的数据不一致。3.4.第一类更新丢失事务 A 和事务 B 同时访问同一个数据,事务 B 先提交修改,事务A 回滚操作。导致事务 B 的修改丢失。3.5.第二类更新丢失事务 A 和事务 B 同时访问同一个数据,事务 B 先提交修改,事务A 再提交。导致事务B 的修改被覆盖。4.数据库锁机制数据并发会引发很多问题,在一些场合下有些问题是允许的,但在另外一些场合下可能却是致命的。数据库通过锁的机制解决并发访问的问题,虽然不同的数据库在实现细节上存在差别,但原理基本上是一样的。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 12 页 -第 4 页4.1.按锁的作用范围分类4.1.1.行级锁/行锁定4.1.2.表级锁/表锁定4.2.按锁的排他性分类4.2.1.共享锁4.2.2.独占锁(排他锁)4.3.Oracle 常用的 5 种锁定4.3.1.行共享锁允许多个会话共享锁定的行数据,但不允许对这些行的独占锁。例如 select.for update。行共享锁定并不防止对数据行进行更改的操作,但是可以防止其他会话获取独占性数据表锁定。4.3.2.行独占锁对行进行独占,不允许其它的共享锁(表,行)、独占锁(表,行)和表共享行独占锁。例如 insert,update。4.3.3.表共享锁允许多个会话共享表数据,但不允许其它的独占锁(表,行)、表共享行独占锁。可以实现表级事务一致性。4.3.4.表独占锁对表进行独占,不允许其它的共享锁(表,行)、读占锁(表,行)和表共享行独占锁。达到序列化操作级别。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 12 页 -第 5 页4.3.5.表共享行独占锁允许多个会话共享表数据,但同一时刻只能有一个行独占锁。可以达到数据共享同时防止脏读、不可重复读、幻像读。表共享锁定 可以让会话具有对表事务级一致性访问,因为其它会话在你提交或者回溯该事务并释放对该表的锁定之前不能更改这个被锁定的表(因为要修改表的记录,就必须获得行独占锁,但是共享锁会阻止独占锁的获取,这样原来其它正在读取表记录的事务就不会出现脏读、不可重复读、幻像读的情况了);表共享行独占锁与其不同则是多了一个行独占,这样效率更高。4.4.Oracle 常用的 5 种锁定对比行共享行独占表共享表共享行独占表独占说明该行 其他行该行其他行该行其他行行共享显式调用:LOCK TABLE IN ROW SHARE MODE 隐式调用:SELECT FOR UPDA TE 行独占显式调用:LOCK TABLE IN ROW EXCLUSIVE MODE 隐式调用:INSERT/UPDA TE/DELETE 表共享显式调用:LOCK TABLE IN SHARE MODE 表共享行独占显式调用:LOCK TABLE IN SHARE ROW EXCLUSIVE MODE 表独占显式调用:LOCK TABLE IN EXCLUSIVE MODE 5.事务隔离级别尽管数据库为用户提供了锁的DML 操作方式,但直接使用锁管理是非常麻烦的,因此数据库为用户提供了自动锁机制。只要用户指定会话的事务隔离级别,数据库就会分析事务中的 SQL 语句,然后自动为事务操作的数据资源添加上适合的锁。JDBC API 支持的隔离级别:名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 12 页 -第 6 页5.1.TRANSACTION_NONE 说明 不支持事务。5.2.TRANSACTION_READ_UNCOMMITTED 说明在提交前一个事务可以看到另一个事务的变化。这样 脏读、不可重复读和虚读都是允许的。不允许第一类丢失更新、允许第二类丢失更新。5.3.TRANSACTION_READ_COMMITTED 说明 读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。不允许第一类丢失更新、允许第二类丢失更新。5.4.TRANSACTION_REPEATABLE_READ 说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。不允许第一类丢失更新和第二类丢失更新。5.5.TRANSACTION_SERIALIZABLE 是最高的事务级别,它 防止脏读、不可重复读和虚读。不允许第一类丢失更新和第二类丢失更新。6.Java 事务类型6.1.JDBC 事务JDBC 事务是用Connection 对象控制的。JDBC Connection 接口(java.sql.Connection)提供了两种事务模式:自动提交 和手工提交。java.sql.Connection 提供了以下控制事务的方法:setAutoCommit(boolean)、getAutoCommit()、commit()、rollback()使用JDBC 事务界定时,您可以将多个SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个JDBC 事务不能跨越多个数据库。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 12 页 -第 7 页6.2.JTA(Java Transaction API)事务JTA 是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用 JTA 来访问事务。JTA 允许 应用程序执行 分布式事务处理-在两个或多个网络计算机资源上访问并且更新数据,这些 数据可以分布在多个数据库上。JDBC 驱动程序的JTA 支持极大地增强了数据访问能力。如 果 计 划 用JTA 界 定 事 务,那 么 就 需要 有 一 个实 现javax.sql.XADataSource、javax.sql.XAConnection 和javax.sql.XAResource 接口的JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与JTA 事务。一个XADataSource 对象就是一个XAConnection 对象的工厂。XAConnection 是参与JTA 事务的JDBC 连接。6.3.容器事务容器事务主要是J2EE 应用服务器提供的,容器事务大多是基于JTA 完成,这是一个基于 JNDI 的,相当复杂的API 实现。相对编码实现JTA 事务管理,我们可以通过EJB 容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE 应用服务器提供。这使得我们可以简单的指定将哪个方法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE 容器去解决。使用 EJB CMT 的另外一个好处就是程序员无需关心JTAAPI 的编码,不过,理论上我们必须使用EJB。7.分布式事务分布式事务 是指 事务的参与者、支持事务的服务器、资源服务器以及 事务管理器 分别位于不同的分布式系统的不同节点之上。分布式事务 跨越两个或多个称为资源管理器的服务器。称为事务管理器的服务器组件必须在资源管理器之间协调事务管理。如果分布式事务由Microsoft 分布式事务处理协调器(MS DTC)之类的事务管理器或其他支持Open Group XA分布式事务处理规范的事务管理器来协调,则在这样的分布式事务中,每个SQL Server 数据库引擎实例都可以作为资源管理器来
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号