`

关于事务的一些学习笔记

 
阅读更多

今天在整理资料的时候发现了之前学习事务的时候的一些学习笔记,顺便写篇blog记录一下备以后查验。

 

 

 

事务是什么

1 事务的概念

1.1 为什么需要事务

  在我们日常系统开发当中,我们是不是不可避免的要对一些数据资源 进行访问,但是我们怎么来保证我们对数据资源的访问不会破坏数据资源的完整性呢?这个时候就需要事务了,正是引入了事务的概念,我们平时对数据资源进行操作的时候才不会破坏数据资源的完整性或者说是不变量约束

1.2 何为事务

        前面从为什么需要事务的角度,我们意识到了事务其实就是用来保护系        统处于一致性性状态的一种措施。也可以说是一系列原子操作 的集合。

2 事务的特征

前面从事务目的的角度说明了事务到底是什么,那么事务又是达到保证数据资源完整性的目的的呢?这需要我们来了解一下事务的特征,事务一共有四个特性 (ACID) ,分别是原子性( Atomicity), 一致性( Consistency), 隔离性( Isolation), 持久性( Durability).

2.1 原子性

何为原子性?之前说了事务需要保证数据资源的完整性,那么我们就需要控制对数据资源的访问,使得对数据资源进行访问的操作要么全部成功,否则只要一个操作失败,那么全部失败(虽然有点极端 ^_^ ,但是很必要),这样数据资源就不会因为一部分操作成功,但是一部分操作失败而引起系统不一致。

2.2 一致性

何为一致性呢?一致性就是说,当我们在对数据资源的一次访问过程中,在访问之前和访问之后,数据资源的状态都要处于一种完整的,满足不变量约束的状态。(比如银行转账,当从账户 A 转账到账户 B 后,账户 A 和账户B 的金额总和是不变的,这就是一种不变量约束)。

其实一致性也说出了事务的心声,这也正是事务的目的,但是要想实现此目的,事务必须满足其它的三条特征,原子性,隔离性,持久性是一致性的必要条件。

 

2.3 隔离性

        何为隔离性?隔离性主要是考虑到了系统的并发操作,但系统对数据资        源进行访问的时候,可能同时有好多个并发操作同时进行,这样为了保证系       统的一致性,事务必须具有一定的隔离性,使得并发执行的一些列操作互相      不要产生干扰。

        总之,事务的隔离性,主要是为了保证在多线程环境下,数据资源的一 致性。

2.4 持久性

        何为持久性?持久性就是指在事务结束的时候,事务的结果应该被持久 的保存下来,此特征也是为一致性来服务的,试想一下,假如事务成功了, 但是此时突然断电或者其它的故障,那么此时事务的结果还是应该要保存下      来,不然系统的不变量约束就遭到了破坏。

 

以上是事务的四特征,下面主要来说说事务的隔离性问题,对于事务的隔离性问题, ANSI 标准规定了四个隔离级别,如下 :

3 事务的隔离级别

    在说隔离级别以前,我们先来明确两个问题,读取事务和写事务,读取事务只是对数据库进行读操作,不会引起数据库状态变化,而写事务要对数据库进行更新。下面就以读事务和写事务来加以描述:

3.1 读取未提交( Read uncommited)

         读取未提交隔离级别是最低的一种隔离级别,其中读事务不会阻塞任 何事务,写事务阻塞写事务,但是不阻塞读事务,正是因为写事务不阻塞读 事务,所以就造成读取事务读到的数据可能是脏的,这也就是著名的“脏读   问题”,同时因为读事务没有阻塞写事务,所以在读事务中的两次读取操作    可能读到不同的数据,这也就造成了著名的“不可重复读问题”,同理此种 情况下也存在“幻影读”问题。

3.2 读取已提交( Read commited)

        读取已提交隔离级别中,读事务不会阻塞任何事务,但是写事务会阻塞 读事务和其它写事务,此时因为写事务会阻塞读事务,所以不会出现“脏读” 问题,但是因为此时读事务还是不阻塞写事务,所以“不可重复读”问题还 会出现,同时“幻影读”问题还是会出现。

3.3 可重复读( Repeatable Read)

         可重复读隔离级别中,读事务会阻塞写事务,不阻塞读事务,写事务 会阻塞写事务和读事务,因为此时读事务阻塞了写事务,所以避免了“不可 重复读”的问题,但是此时读事务并没有阻塞对数据库的插入操作,所以此 时“幻影读”问题照样存在。

3.4 序列化 (Serializable)

         Serializable 隔离级别是最严格一种隔离级别,数据库系统会保证执行    此种隔离级别事务的效果和顺序执行的效果一致。不过在日常的开发过程种    很少使用此种隔离级别,因为它严重影响了系统的性能。

  

    以上就是事务的四种隔离级别,但是实际的开发当中,我们还是需要注意以下几个问题:

    1 并不是所有的数据库都支持以上的四种隔离级别,具体的数据库支持的隔离级别可参考相应的数据库文档。

    2  在实际的开发当中,我们经常还会遇到一个问题就是如何在事务隔离级别和系统的并发性方面取得一个折中,如果采用 serializable 隔离级别,这样数据库就做好了并发控制,但是系统性能非常差,此时我们一般采用读取已提交的隔离级别,然后再结合以下几种并发控制的锁定策略:

*    乐观所

*    悲观锁

*   乐观离线锁

*   悲观离线锁

此时其实并发是由应用程序来控制的,而事务的隔离由数据库系统来管理。

事务模型解析

       首先事务模型分为好几种比如平面事务,嵌套事务等,平面事务是一个完整的不能再进行嵌套的事务,而嵌套型事务容许事务进行嵌套,事务嵌套子事务,这样主事务可以对嵌套子事务进行重试,这样增加了事务成功的总体的成功率,嵌套式事务最典型的例子就是订票。比如某人要去旅行,需要路径 A,B,C D 四个不同的地方, A B 需要订火车票, B C 需要订机票, C D 需要订船票,那么如果采用平面事务,只要 A,B,C,D 任意一段路程订票失败那么就订票失败了,这样明显成功率比较低,这种情况下可以采用嵌套型事务来避免平面性事务的刚性失败的缺点。

       上面说了常见的事务模型的类型,下面主要说一下目前 JAVAEE 应用中,我们常见的事务,本地事务或者 resource-local 事务和全局事务或者说 JTA 事务,需要声明的是 resource-local jta 事务都属于前面说的平面事务模型。在具体说这两种不同类型事务之前,首先我们来明确几个事务管理会涉及到的几个参与者:

1 资源管理器( Resource Manager) :资源管理器一般是数据库管理系统,也可以是消息队列,遗留系统等。

2 分布式事务协调者( Distributed Transaction Coordinator,DTC) 1 】:此功能一般是有我们所用的 JavaEE 应用服务器实现,比如 jboss,websphere,weblogic 等。这个角色只有在 JTA 事务中才会存在。

3 事务管理器 (Transaction manager) :每一个事务管理器都与相应的资源管理器所关联,它负责对分布式事务进行提交或者回滚。

4 应用程序( Application)

 

以上四者的关系可以用以下的图形来形象的表述:


 

在日常的系统开发中,我们一般都会使用数据资源(比如数据库)来对系统的状态进行保存,那么我们根据系统涉及的数据资源的多少,将事务分为 RESOURCE-LOCAL 事务或者 JTA 全局分布式事务。

1  RESOURCE-LOCAL 事务

         RESOURCE-LOCAL 事务是指只有一个资源管理( RM) 的事务,比如 我们系统中只涉及到一个数据库,更准确点说应该是事务操作都是对同一个    数据库进行操作。

         此时事务协调着和事务管理器的作用就有底层的资源管理器来实现了。比如目前我们在采用 spring 来管理事务的时候,其实 spring 并没有事务功能,它仅仅是封装了底层数据库的事务操作而已。

2  全局事务或者 JTA 事务

全局事务是涉及多个资源管理器,此时需要引入事务协调者来进行调节,此时就需要两阶段提交协议 2PC two phase commit) ,下面简要说一下两阶段提交协议。

第一阶段:事务协调者发送“准备提交”消息给事务所涉及的所有的事务管理器,然后事务管理器又分送此消息给相应的资源管理器,然后事务管理器又将资源管理的响应情况告诉分布式事务协调者( DTC). 只有此阶段顺利完成后(既所有的资源管理器都同意提交事务),才会进入第二阶段。

第二阶段:当第一个阶段顺利完成后,事务协调者告诉事务管理器去提交事务。

我们可以形象的用下图对分布式事务的参与者进行描述:

 

 

上图描述一种场景,一个分布式事务中需要操作两个数据库和一个 JMS 服务器,在这种场景下,在进行事务操作的时候,对于 DB 来说,首先事务管理器从支持 XA 接口的 JDBC 驱动程序中取得对应的 javax.transaction.xa.XAResource 实现类, 然后从相应的 JDBC 驱动中获取到 javax.sql.XAConnection 的实现类,其中 XAResource 对应用程序是透明的,应用程序只需要拿到 XAConnection 进行操作数据库即可,对于 JMS 过程类似,首先从支持 XA JMS 消息中间件获取 javax.transaction.xa.XAResource ,然后再获取 javax.jms.XAConnection 的实现类,这里 XAResource 同样对应用程序是透明的。

四:参考文献

1  << 精通 EJB3.0>>

2  <<Enterprise Javabean 3.0>>

3  << 面向模式的软件体系结构 >> 2 ,卷 3

4  << 服务器端组件模式 >>

5  Specification: JSR-000907 Java(tm) Transaction API (JTA) Specification ("Specification"),此文档在附件,有需要的可以下载看看。

 

  • 大小: 64.4 KB
  • 大小: 51.6 KB
0
0
分享到:
评论
1 楼 cetusz 2012-05-28  
感谢分享

相关推荐

    分布式事务学习笔记

    ### 分布式事务学习笔记知识点详解 #### 一、什么是分布式事务 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单来说,一次大的操作由不同...

    spring hibernate 事务管理学习笔记(二)

    在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...

    spring hibernate 事务管理学习笔记(一)

    在学习过程中,阅读博客如《spring hibernate 事务管理学习笔记(一)》是非常有益的,它通常会包含具体的示例代码和实践建议。你可以参考这个博客链接(https://microjava.iteye.com/blog/525973),结合实际项目,...

    PCTP个人学习笔记—TiDB数据库事务设计

    PCTP个人学习笔记—TiDB数据库事务设计

    Redis学习笔记整理

    四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31

    数据仓库学习笔记

    "数据仓库学习笔记" 数据仓库学习笔记是研究数据仓库的笔记,旨在探索数据仓库的发展和演化过程。数据仓库学习笔记第 1 章讲述了决策支持系统的发展历史和演化过程。 数据仓库学习笔记中提到,决策支持系统(DSS)...

    笔记本学习笔记

    在学习笔记中,事务的提交(commit)、回滚(rollback)和保存点(savepoint)是DML操作不可或缺的部分。它们构成了事务控制的基本单元,帮助用户灵活地处理数据操作中的各种情况。 ### SQLPlus的使用 Oracle...

    SQL SERVER 事务处理学习笔记

    本篇文章将深入探讨SQL Server的事务处理,特别是关于隔离级别的理解及其应用,以及锁的模式和作用。 首先,我们来看看SQL Server 2000提供的四种隔离级别: 1. **读未提交(READ UNCOMMITTED)**:允许事务读取...

    学习笔记 学习笔记 学习笔记 学习笔记 学习笔记 学习笔记 学习笔记 学习笔记

    【标题】: "DWS学习笔记" 【描述】: "DWS(Data Warehouse System,数据仓库系统)是用于企业数据分析的重要工具,它整合了来自不同业务系统的数据,为决策支持提供高效、一致的信息。这份学习笔记主要涵盖了DWS的...

    Oracle学习笔记精华版

    Oracle学习笔记精华版是针对数据库管理系统Oracle的一份重要学习资源,涵盖了从基础概念到高级特性的全面知识。Oracle,作为全球广泛使用的大型企业级数据库系统,对于IT专业人员尤其是数据库管理员(DBA)来说,是...

    j2ee学习笔记-j2ee学习笔记

    **J2EE学习笔记概述** J2EE(Java 2 Platform, Enterprise Edition)是一个由Sun Microsystems(现已被Oracle收购)开发的平台,主要用于构建企业级的分布式应用系统。它提供了服务器端组件模型、服务和API,支持...

    Spring框架学习笔记

    这份"Spring框架学习笔记"涵盖了Spring框架的基础知识、核心组件以及高级特性,对于初学者来说是一份宝贵的资料。 一、Spring框架概述 Spring框架是为了解决企业应用开发的复杂性而设计的,它提供了一个全面的基础...

    尚医通学习笔记,尚医通学习笔记

    《尚医通学习笔记》是针对尚医通平台的学习资料,涵盖了使用Java和SpringCloud进行系统开发的相关知识。本文将详细解析这些知识点,帮助读者深入理解如何在医疗信息化领域运用这些技术。 首先,我们来了解一下Java...

    Spring.NET学习笔记16——事务管理Demo源码

    在本篇“Spring.NET学习笔记16——事务管理Demo源码”中,我们将深入探讨Spring.NET的事务管理机制及其实际应用。 事务管理是软件开发中的关键部分,它确保数据库操作的一致性和完整性。Spring.NET通过其事务管理...

    MySQL-事务篇 学习笔记

    并发事务问题模拟——观看记录

    Oracle学习笔记(事务知识点)

    Oracle学习笔记(事务知识点),事务处理:所谓的事务处理其实就是保证数据操作的完整性,所有的操作要么同时成功,要么同时失败

    整理的前端 学习笔记资料

    "前端 学习笔记.zip"这个压缩包文件包含了关于前端开发的学习资料,特别是对于Web应用程序的开发有着深入的探讨。标签"web app"暗示了这些笔记主要关注的是构建Web应用程序的相关技术。 在压缩包中的"MyBatis-Plus...

    JDBC学习笔记--JDBC学习笔记

    JDBC学习笔记 JDBC(Java DataBase Connectivity)是一种Java程序语言访问数据库的标准接口。它使得Java程序可以连接到各种不同的数据库管理系统,例如Oracle、SQL Server、MySQL、DB2、Sybase等。 JDBC的概念 ...

    MyBatis学习笔记1

    总之,"MyBatis学习笔记1"是一份关于MyBatis框架基础和进阶使用的教程,通过学习,读者可以掌握MyBatis的基本使用方法,理解其核心机制,并能进行源码级别的探索,提升数据库操作的效率和灵活性。配合"mybatis_test...

    spring学习笔记事务的

    ### Spring框架中的事务管理 #### 一、Spring事务概述 在Spring框架中,事务管理是一项重要的功能,它能够确保业务操作的一致性和完整性。Spring提供了两种类型的事务管理:编程式事务管理和声明式事务管理。 - *...

Global site tag (gtag.js) - Google Analytics