小牛带你走进Spring的事务

摘要
本文摘抄了Spring事务相关的一些理论,主要讲述事务的特性、事务的传播行为、事务的隔离规则。

关键词:事务特性,事务传播,事务隔离

一、什么是事务
事务是用来保证数据的完整性和一致性,正如金钱转账,金钱总数不会增加也不会减少。

数据库 事务管理有四个特性(ACID):

特性描述原子性(Atomicity)事务作为一个整体被执行,要么全部被执行,要么都不执行。一致性(Consistency)事务应确保数据的状态从一个一致状态转变为另一个一致状态,数据不应该被破坏。隔离性(Isolation)多个事务并发执行时,一个事务的执行不应影响其他事务的执行。持久性(Durability)已被提交的事务对数据的修改应该永久性的。

二、Spring事务管理器

  1. 事务管理接口

Spring中定义了事务管理的总接口PlatformTransactionManager,该接口定义了以下几个接口来管理事务:

getTransaction() - 获取事务状态(TransactionStatus),该事务由(TransactionDefinition定义)
commit() - 提交事务
rollback() - 回滚事务
Spring不直接管理事务,而是提供一个事务管理接口,由其他平台(如JDBC、Hibernate)自己实现事务管理。

几个具体的事务:

事务名称管理器类说明JDBC事务org.springframework.jdbc.datasource.DataSourceTransactionManager通过调用java.sql.Connection来管理事务Hibernateorg.springframework.orm.hibernate3.HibernateTransactionManager事务管理由org.hibernate.Transaction对象负责Java持久化API事务(JPA)org.springframework.orm.jpa.JpaTransactionManagerJpaTransactionManager与由工厂(javax.persistence.EntityManagerFactory)所产生的JPA EntityManager合作来构建事务Java原生API事务org.springframework.transaction.jta.JtaTransactionManagerJtaTransactionManager将事务管理的责任委托给javax.transaction.UserTransaction和javax.transaction.TransactionManager对象(允许在多个数据库之间管理多个事务)

关于JTA,参考Java中的事务——JDBC事务和JTA事务

小牛带你走进Spring的事务
(Spring事务管理器)

  1. 事务管理与AOP

Spring通过AOP拦截所有需要事务管理的业务处理方法。

三、Spring事务属性
Spring事务有几个属性,TransactionDefinition接口可以体现出来:

public interface TransactionDefinition {

// 事务传播行为定义

int PROPAGATION_REQUIRED = 0;

int PROPAGATION_SUPPORTS = 1;

int PROPAGATION_MANDATORY = 2;

int PROPAGATION_REQUIRES_NEW = 3;

int PROPAGATION_NOT_SUPPORTED = 4;

int PROPAGATION_NEVER = 5;

int PROPAGATION_NESTED = 6;

// 事务隔离级别定义

int ISOLATION_DEFAULT = -1;

int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;

int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;

int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;

int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

// 默认超时时间

int TIMEOUT_DEFAULT = -1;

// 获取事务传播行为

int getPropagationBehavior();

// 获取事务隔离级别

int getIsolationLevel();

// 获取事务超时时间

int getTimeout();

// 获取事务是否只读

boolean isReadOnly();

// 获取事务名字

String getName();

}

接口的定义加上回滚规则,事务可以有以下五个基本配置:事务传播行为、事务隔离级别、事务超时、事务只读、回滚规则

  1. 传播行为

所谓传播行为(propagation behavior)指一个事务方法被另一个事务方法调用时,事务应该如何处理。被调用的方法可能在现有事务中运行,或者启动一个新的事务,在自己事务内运行。

传播行为含义解释PROPAGATION_REQUIRED表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务有且只有一个事务PROPAGATION_SUPPORTS表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行如果方法单独调用则是非事务执行,如果方法被另一个有事务的方法调用,被调用方法则加入事务PROPAGATION_MANDATORY表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常如果单独非事务调用会抛异常,必须被其它事务方法调用,加入到事务中。PROPAGATION_REQUIRED_NEW表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager总是开启一个新的事务,原调用事务存在的话会被挂起,直至事务完成。PROPAGATION_NOT_SUPPORTED表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager总是非事务地执行该方法,如果调用事务存在的话会被挂起,直至方法执行完成PROPAGATION_NEVER表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常总是非事务性执行方法,否则抛出异常PROPAGATION_NESTED表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

  1. 隔离规则

事务的执行会存在并发的,隔离级别定义了一个事务受其它并发事务影响的程度。

有两个表格:

并发事务引起的问题

问题定义出现原因脏读读到无效的数据当一个事务读取了另一个事务修改但未提交的数据,如果修改回滚,则事务读取了无效的数据。不可重复读同一个事务中两次相同查询中,读取到不同的数据一个事务两次查询期间,另一个并发事务对数据进行了更新。幻读同一个事务在两次相同的查询中,读取到不同记录数的数据一个事务两次查询期间,另一个并发事务进行了数据新增或删除。

隔离级别

隔离级别说明并发事务可能引起的问题ISOLATION_DEFAULT使用后端数据库默认的隔离级别具体情况具体分析ISOLATION_READ_UNCOMMITTED最低的隔离级别,允许读取尚未提交的数据变更脏读、不可重复读、幻读ISOLATION_READ_COMMITTED允许读取并发事务已经提交的数据不可重复读、幻读ISOLATION_REPEATABLE_READ对同一字段的多次读取结果一致,除非字段被本事务修改幻读ISOLATION_SERIALIZABLE最高的隔离级别,完全服从ACID原则,通常通过锁表实现(最慢)无

  1. 事务超时

给定事务一个超时时间,如果特定时间事务没有执行完毕,事务会自动回滚。

  1. 是否只读?

设置了只读事务,那么在此事务执行过程中,其它事务对数据库的修改对于该事务来说是透明的,即看不到其它事务修改后的数据。这通常用于执行多次查询来统计信息时,能够保证数据的整体一致性。

  1. 回滚规则

回滚规则定义了哪些异常,事务会进行回滚。默认情况下,事务只有遇到运行时异常才会回滚,而在遇到检查型异常时不会回滚。

四、Spring事务管理形式

  1. 编程式事务

使用TransactionTemplate或PlatformTransactionManager

TransactionTemplate tt = new TransactionTemplate();

tt.execute(status -> {

// 执行操作

doSth();

// 返回操作结果

return obj;

});

  1. 声明式事务

参考:Spring事务配置的五种方式

六、总结
Spring定义了事务管理器的接口,具体实现由特定平台来实现;
Spring事务有五个属性:事务传播行为、事务隔离级别、事务超时、事务只读、回滚规则;
传播行为:required、supports、mandatory、required_new、not_support、never、nested;
隔离级别:default、read_uncommited、read_committed、repeatable_read、serializable;

原文地址:http://blog.51cto.com/13842645/2175827

时间: 2024-12-11 13:08:57

小牛带你走进Spring的事务的相关文章

带你走进spring的世界

spring有两大特性,其一为ioc,其二为aop 1.ioc的理解 ioc为依赖注入,他的好处就是把创建对象的权利交给spring去管理,这样的好处是 将应用程序中的对象解耦,传统的方式程序中的对象与对象引用的对象相互依赖,这样就使得依赖性增高,增加耦合性. di为控制反转,以前创建对象的权利由应用程序,现在交给spring来管理 从应用层到ioc这就为控制反转. ioc提供了两种容器: 1)bean工厂(BeanFactory),采用工厂模式,负责创建和分发bean对象,bean工厂还参与到

一文带你深入浅出Spring 事务原理

Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(

spring的事务

Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身 1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持 1.2.2. Java平台的分布式事务支持 1.2.2.1. 基于JTA的分布式事务管理 1.2.2.1.1. JTA编程事务管理 1.2.2.1.2.

spring的事务操作

我们项目一期已经差不多结束了,所以一些细节也被拿了出来,出现最多的就是事务的操作了.因为自己负责的是一个模块(因为是另外一个项目的负责人),所以组员经常会遇到事务的问题,会出现很多奇葩的用法,各种乱用,估计他们就知道在方法上面注解@Transactional,但是其中的很多细节都不知道.所以经常会出现一个情况,就是一大坨代码出现了事务的问题,然后我就去各种改.所以今天也对事务做一个总结吧.以后忘记了可以回来看看. 一般我们使用事务最主要注重的是三个方面: 1.propagation:传播性  

分布式事务系列(1.2)Spring的事务体系

1 系列目录 分布式事务系列(开篇)提出疑问和研究过程 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析 分布式事务系列(1.2)Spring事务体系 2 三种事务模型 三种事务模型如下: 本地事务模型 编程式事务模型 声明式事务模型 先来看几个例子: 案例1: Connection conn=jdbcDao.getConnection(); PreparedStatement ps=conn.prepareStatement("inse

Spring 并发事务的探究

前言 在目前的软件架构中,不仅存在单独的数据库操作(一条SQL以内,还存在逻辑性的一组操作.而互联网软件系统最少不了的就是对共享资源的操作.比如热闹的集市,抢购的人群对同见商品的抢购由一位售货员来处理,这样虽然能保证买卖的正确进行,但是牺牲了效率,饱和的销售过程并不能高效处理所有的购买请求,最后打烊了部分顾客悻悻而归.而电脑的发明是让人类解放于这种低效的工作中,提高销售性能,比如抢购系统,秒杀系统等.而这种销售过程必然包含了检查库存.秒杀排队.校对商品信息.下单等一系列的组合操作,而一个交易过程

一篇文章带你了解spring框架

虽然现在流行用SpringBoot了,很多配置已经简化和封装了,但是对于Spring的一些基础我们了解一些是对我们自己的架构思想很有帮助的!接下来和笔者一起来探讨一下Spring框架吧! 1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发.Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安

阶段3 2.Spring_10.Spring中事务控制_4 spring中事务控制的一组API

分析aop的 xml 的代码.更直观一些 事务提交和回滚就是我们重复的代码 spring业余事务管理器,我们拿过来直接用就可以 提交和回滚的后面直接调用释放.所以释放资源之类就是多余的 在绑定连接到线程的时候,直接就设置成false,所以开启事务这个通知 也是多余的 spring中的事务 需要先导入包pom.xml 用刚上线类.DataSourceTransactionManager 如果用到Hibernate的话.这个是真正带着代码的实现类 TransactionDefinition 事务的隔

6.EVE-NG网卡桥接,带您走进更高级的实验

文章列表(关注微信公众号EmulatedLab,及时获取文章以及下载链接) 1.EVE-NG介绍(EVE-NG最好用的模拟器,仿真环境时代来临!) 2.EVE-NG安装过程介绍 3.EVE-NG导入Dynamips和IOL 4.EVE-NG导入QEMU镜像 5.EVE-NG关联SecureCRT,VNC,Wireshark 6.EVE-NG网卡桥接,带您走进更高级的实验 7.EVE-NG硬盘扩容,存储海量镜像 8.EVE-NG定制个人镜像,脚本快速导入 9.EVE-NG容纳H3C.Huawei,