文档章节

Spring事务管理

JasonSE
 JasonSE
发布于 2015/04/04 21:24
字数 2233
阅读 70
收藏 3
点赞 0
评论 0

Spring的事务管理是其非常重要的一个方面,Spring的应用主要集中在Ioc/AOP/DAO/事务四个方面。这部分内容比较抽象,需要花费大篇幅来写。


一、事务控制的基本知识

不管是什么事务,必须先对数据库的事务概念有个明确认识才行。首先先简单介绍下数据库的事务。


事务的概念:事务是一组原子性操作的工作单元,这组工作单元要么执行成功,要么不成功。事务有四个属性--原子性、一致性、独立性和持久性(CAID),所有这些方面都是依靠事务资源去维护。


事务隔离:SQL 标准用三个必须在并行的事务之间避免的现象定义了四个级别的事务隔离。 这些不希望发生的现象是:


脏读(dirty reads) 

一个事务读取了另一个未提交的并行事务写的数据。 


不可重复读(non-repeatable reads) 

一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。 


幻读(phantom read) 

一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。 


这四种隔离级别和对应的行为如下表:

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
读未提交(Read uncommitted) 可能 可能 可能
读已提交(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能
可串行化(Serializable ) 不可能 不可能 不可能

Spring事务包中的TransactionDefinition接口有对应的隔离级别的定义。搞清楚以上的概念,才能更好理解Spring的事务管理。


二、从编程的角度认识事务

和数据库事务概念几乎完全一样:事务是一种机制,把组成的多个操作视为一个操作单元进行处理,这个单元要么全部执行成功,要么全部不执行。在事务中,涉及的操作可能依赖于很多不同的数据库和服务器。


从程序角度考虑,事务可以分为两大类:一种是本地事务,一种是全局事务(也叫分布式事务)。


本地事务:是针对某个独立的事务资源(如JDBC)操作的事务。

全局事务:是协同或横跨多个资源(如JDBC连接、数据库等)操作的事务(上下文),多个资源协作是由事务管理器来完成的。

事务源:是可以绑定事务操作的资源。事务的概念最初来自数据库的操作,事务的资源也仅限于数据库。但编程中的事务,事务源很广泛,不但可以包含数据库,还可以包含打印机等。


本地事务和全局事务有很大的区别:

全局事务的控制非常复杂,全局事务使用两阶段提交协议(2PC)来提交资源源的变化。阶段一请求所有资源准备实现改变;阶段二请求做实际的改变。

全局事务ID(XID)是用于跟踪所有分布式事务相关的改变。全局事务的实现需要由专门的应用服务器或者容器去实现。在Java中,可以借助实现了Java Transaction API的库来进行全局事务控制。


JDBC与JTA

  • JDBC是Java database connectivity 的缩写,意思是Java数据库连接。一般本地事务是与一个数据库连接相关的,因此Java中常称本地事务为JDBC事务。JDBC本身提供了简单的本地事务控制,可以满足针对一个JDBC连接事务的需求。

  • JTA是Java Transaction API的缩写,意思是Java事务API,这是一种组复杂事务控制接口,这组接口作为J2EE规范暴露给容器开发商,一般都由J2EE容器来实现。Spring很牛,也实现了这组API,使得任何应用使用JTA事务变得更容易。


三、认识Spring的事务包的API

Spring对事务的控制的API全部位于org.springframework.transaction包下面,其中出去异常定义的类外,仅有四个接口,这四个接口是Spring操作事务的核心,下面一一介绍:

org.springframework.transaction

Interfaces  

        PlatformTransactionManager 

        SavepointManager 

        TransactionDefinition 

        TransactionStatus 

Exceptions  

        CannotCreateTransactionException 

        HeuristicCompletionException 

        IllegalTransactionStateException 

        InvalidIsolationLevelException 

        InvalidTimeoutException 

        NestedTransactionNotSupportedException 

        NoTransactionException 

        TransactionException 

        TransactionSuspensionNotSupportedException 

        TransactionSystemException 

        TransactionTimedOutException 

        TransactionUsageException 

        UnexpectedRollbackException 


要搞明白Spring事务控制的原理,必须理解上面四个接口的含义,下面一一介绍之。

1、PlatformTransactionManager

是一个事务管理平台,该接口有许多具体的事务实现类,例如DataSourceTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JpaTransactionManager, JtaTransactionManager, TopLinkTransactionManager, WebLogicJtaTransactionManager 等等,通过实现此接口,Spring可以管理任何实现了这些接口的事务。开发人员也可以使用统一的编程模型来控制管理事务。此接口中有三个方法:

 void commit(TransactionStatus status) 

          Commit the given transaction, with regard to its status. 

          监视事务状态,并提交一个事务。

 TransactionStatus getTransaction(TransactionDefinition definition) 

          Return a currently active transaction or create a new one, according to the specified propagation behavior. 

          根据事务的隔离级别和传播行为,返回当前活动的事务或者产生一个新的事务。

 void rollback(TransactionStatus status) 

          Roll back the given transaction. 

          回滚给定的事务。


2、SavepointManager

事务回滚点管理接口,提供创建、释放回滚点,或者回滚到指定的回滚点。

 方法摘要: 

 Object createSavepoint() 

          Create a new savepoint. 

          创建一个新的回滚点。

 void releaseSavepoint(Object savepoint) 

          Explicitly release the given savepoint. 

          释放一个给定的回滚点。

 void rollbackToSavepoint(Object savepoint) 

          Roll back to the given savepoint.

          回滚到给定的回滚点。


3、TransactionDefinition

这个接口的作用就是定义事务的名称、隔离级别、传播行为、超时时间长短、只读属性等。


字段摘要:

(因为是接口,里面都是int常量,即public static final类型的,很多,我就只写常量的名字和含义)

这些接口分两组,分别是事务隔离级别和事务传播行为。


  • 事务隔离级别(数据库级别的知识) 

TransactionDefinition.ISOLATION_DEFAULT  

使用底层数据库默认隔离级别。 

TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读未提交

最低隔离等级,允许事务读取其他并行的事务还没有提交的数据,会发生脏读(dirty reads)、不可重复读(non-repeatable reads)、幻读(phantom read)等问题。

TransactionDefinition.ISOLATION_READ_COMMITTED 读已提交

允许事务读取其他并行的事务已经提交的数据,可以防止脏读问题。

TransactionDefinition.ISOLATION_REPEATABLE_READ 可重复读

保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。

TransactionDefinition.ISOLATION_SERIALIZABLE 可串行化

所有事务都严格隔离,各个事务顺序执行。很容易发生死锁。


  • 事务传播行为

TransactionDefinition.PROPAGATION_REQUIRED 

支持现有的事务,如果没有则新建一个事务。

TransactionDefinition.PROPAGATION_SUPPORTS 

支持现有的事务,如果没有则以非事务状态运行。

TransactionDefinition.PROPAGATION_MANDATORY 

支持现有事务,如果没有则抛出异常。

TransactionDefinition.PROPAGATION_REQUIRES_NEW 

总是发起一个新事务。如果当前已存在一个事务,则将其挂起。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED 

不支持事务,总是以非事务状态运行,如果当前存在一个事务,则将其挂起。

TransactionDefinition.PROPAGATION_NEVER 

不支持事务,总是以非事务状态运行,如果当前存在一个事务,则抛出异常。

TransactionDefinition.PROPAGATION_NESTED 

如果石阡已经存在一个事务,则以嵌套事务的方式运行,如果当前没有事务,则创建一个新事务。 


 方法摘要: 

 int getIsolationLevel() 

          Return the isolation level. 

          返回事务的隔离级别。

 String getName() 

          Return the name of this transaction. 

          返回事务的名字。

 int getPropagationBehavior() 

          Return the propagation behavior. 

          返回事务的是传播行为。

 int getTimeout() 

          Return the transaction timeout. 

          返回事务的超时时间。

 boolean isReadOnly() 

          Return whether to optimize as read-only transaction.

          返回是否(优化为)只读属性。


4、TransactionStatus 

这个接口的作用就是获取事务的状态(回滚点、是否完成、是否新事物、是否回滚)属性,还可以进行事务rollback-only的设置。

方法摘要: 

 boolean hasSavepoint() 

          Return whether this transaction internally carries a savepoint, i.e. has been created as nested transaction based on a savepoint.

          判断这个事务是否有一个内在的回滚点(savepoint),即创建为基于回滚点的嵌套事务。

 boolean isCompleted() 

          Return whether this transaction is completed, that is, has already been committed or rolled back. 

          判断这个事务是否完成,也就是已经提交或者回滚。

 boolean isNewTransaction() 

          Return if the transaction is new, else participating in an existing transaction. 

          判断一个事物是否为新事务,或者是这个事务参与到一个已经存在的事务里面。

 boolean isRollbackOnly() 

          Return if the transaction has been set rollback-only. 

          判断这个事务是否已经设置了rollback-only。

 void setRollbackOnly() 

          Set the transaction rollback-only. 

          设置这个事务rollback-only。

本文转载自:http://lavasoft.blog.51cto.com/62575/73567/

共有 人打赏支持
JasonSE
粉丝 32
博文 54
码字总数 15572
作品 0
朝阳
程序员
Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0
05/18
0
0
Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getCon...

rockypeng
2014/01/19
0
0
Spring编程式和声明式事务实例讲解

Java面试通关手册(Java学习指南):https://github.com/Snailclimb/JavaGuide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理...

snailclimb
05/23
0
0
分析 Spring 的编程式事务管理及声明式事务管理(转)

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之。 先决条件...

君辰
2015/07/27
0
0
Spring事务管理机制的实现原理-动态代理 .

分析一下Spring事务管理机制的实现原理。由于Spring内置AOP默认使用动态代理模式实现,我们就先来分析一下动态代理模式的实现方 法。动态代理模式的核心就在于代码中不出现与具体应用层相关联...

swk998741
2014/03/17
0
0
spring事务管理源码解析之namespaceHandler

说在前面 本文转自“天河聊技术”微信公众号 spring事务管理项目开发中都会用到,大家一般用的都是声明式事务管理,spring也集成jta全局事务管理的支持,用的比较少,本次主要针对声明式本地...

天河2018
07/07
0
0
spring,mybatis事务管理配置与@Transactional注解使用

概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型...

北京-卫斯理
2015/07/30
0
1
[转载]69道Spring面试题和答案

原文地址 http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概......

王木东
2017/03/27
0
0
Spring Test 整合 JUnit 4 使用总结

加入依赖包   使用Spring的测试框架需要加入以下依赖包: JUnit 4 (官方下载:https://github.com/KentBeck/junit/downloads) Spring Test (Spring框架中的test包) Spring 相关其他依赖...

backtract
2013/11/04
0
0
关于Spring 声明式事务处理时,throws exception不回滚的问题

文章转自:http://cn-done.iteye.com/blog/775519 前一段时间,项目代码评审,发现有TX不使用Spring的事务处理,而直接封装方法,手动进行数据的回滚,得悉原因是:抛出异常以后事务不起作 ...

巴顿
2013/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
25分钟前
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
42分钟前
28
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
47分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
今天
0
0
mac Homebrew 指令积累

1通用命令 brew install [包名] //安装包 brew list //列举安装的包 brew info [包名] // 显示安装包的详细信息 mysql 相关 #启动mysql 服务 brew service start mysql my...

Kenny100120
今天
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
5
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部