Spring事务管理(详解+实例)

上传人:206****923 文档编号:41775702 上传时间:2018-05-31 格式:DOCX 页数:50 大小:156.06KB
返回 下载 相关 举报
Spring事务管理(详解+实例)_第1页
第1页 / 共50页
Spring事务管理(详解+实例)_第2页
第2页 / 共50页
Spring事务管理(详解+实例)_第3页
第3页 / 共50页
Spring事务管理(详解+实例)_第4页
第4页 / 共50页
Spring事务管理(详解+实例)_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《Spring事务管理(详解+实例)》由会员分享,可在线阅读,更多相关《Spring事务管理(详解+实例)(50页珍藏版)》请在金锄头文库上搜索。

1、参考的文章如下:Spring 事务机制详解Spring 事务配置的五种方式Spring 中的事务管理实例详解1 1 初步理解初步理解理解事务之前,先讲一个你日常生活中最常干的事:取钱。 比如你去 ATM 机取 1000 块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉 1000 元钱;然后 ATM 出 1000 元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了 1000 块但是 ATM 出钱失败的话,你将会损失 1000 元;如果银行卡扣钱失败但是 ATM 却出了 1000 块,那么银行将损失 1000 元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步

2、骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。 事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。 事务有四个特性:ACID原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的

3、状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。2 2 核心接口核心接口Spring 事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解 Spring 的事务接口来了解 Spring 实现事务的具体策略。 Spring 事务管理涉及的接口的联系如下:2.

4、12.1 事务管理器事务管理器Spring 并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate 或者 JTA 等持久化机制所提供的相关平台框架的事务来实现。 Spring 事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring 为各个平台如 JDBC、Hibernate 等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。此接口的内容如下:Public interface PlatformTransactionManager(). /

5、 由 TransactionDefinition 得到 TransactionStatus 对象TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; / 提交Void commit(TransactionStatus status) throws TransactionException; / 回滚Void rollback(TransactionStatus status) throws TransactionException; 从这里可知具体的具体的事

6、务管理机制对 Spring 来说是透明的,它并不关心那些,那些是对应各个平台需要关心的,所以 Spring 事务管理的一个优点就是为不同的事务 API 提供一致的编程模型,如 JTA、JDBC、Hibernate、JPA。下面分别介绍各个平台框架实现事务管理的机制。2.1.12.1.1 JDBCJDBC 事务事务如果应用程序中直接使用 JDBC 来进行持久化,DataSourceTransactionManager 会为你处理事务边界。为了使用 DataSourceTransactionManager,你需要使用如下的 XML 将其装配到应用程序的上下文定义中:实际上,DataSourceTr

7、ansactionManager 是通过调用 java.sql.Connection 来管理事务,而后者是通过 DataSource 获取到的。通过调用连接的 commit()方法来提交事务,同样,事务失败则通过调用 rollback()方法进行回滚。2.1.22.1.2 HibernateHibernate 事务事务如果应用程序的持久化是通过 Hibernate 实习的,那么你需要使用HibernateTransactionManager。对于 Hibernate3,需要在 Spring 上下文定义中添加如下的声明:sessionFactory 属性需要装配一个 Hibernate 的 se

8、ssion 工厂,HibernateTransactionManager 的实现细节是它将事务管理的职责委托给org.hibernate.Transaction 对象,而后者是从 Hibernate Session 中获取到的。当事务成功完成时,HibernateTransactionManager 将会调用 Transaction 对象的 commit()方法,反之,将会调用 rollback()方法。2.1.32.1.3 JavaJava 持久化持久化 APIAPI 事务(事务(JPAJPA)Hibernate 多年来一直是事实上的 Java 持久化标准,但是现在 Java 持久化 API

9、 作为真正的 Java 持久化标准进入大家的视野。如果你计划使用 JPA 的话,那你需要使用 Spring 的JpaTransactionManager 来处理事务。你需要在 Spring 中这样配置JpaTransactionManager:JpaTransactionManager 只需要装配一个 JPA 实体管理工厂(javax.persistence.EntityManagerFactory 接口的任意实现)。JpaTransactionManager 将与由工厂所产生的 JPA EntityManager 合作来构建事务。2.1.42.1.4 JavaJava 原生原生 APIAPI

10、 事务事务如果你没有使用以上所述的事务管理,或者是跨越了多个事务管理源(比如两个或者是多个不同的数据源),你就需要使用 JtaTransactionManager:JtaTransactionManager 将事务管理的责任委托给 javax.transaction.UserTransaction和 javax.transaction.TransactionManager 对象,其中事务成功完成通过UserTmit()方法提交,事务失败通过 UserTransaction.rollback()方法回滚。2.22.2 基本事务属性的定义基本事务属性的定义上面讲到的事务管理器接口 Platform

11、TransactionManager 通过getTransaction(TransactionDefinition definition)方法来得到事务,这个方法里面的参数是 TransactionDefinition 类,这个类就定义了一些基本的事务属性。 那么什么是事务属性呢?事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。事务属性包含了 5 个方面,如图所示:而 TransactionDefinition 接口内容如下:public interface TransactionDefinition int getPropagationBehavior(); / 返回事

12、务的传播行为int getIsolationLevel(); / 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据int getTimeout(); / 返回事务必须在多少秒内完成boolean isReadOnly(); / 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的 我们可以发现 TransactionDefinition 正好用来定义事务属性,下面详细介绍一下各个事务属性。2.2.12.2.1 传播行为传播行为事务的第一个方面是传播行为(propagation behavior)。当事务方法被另一个事务方法调用时,必须指定事务应该

13、如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。Spring 定义了七种传播行为:传播行为传播行为含义含义PROPAGATION_REQUIRED表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务PROPAGATION_SUPPORTS表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行PROPAGATION_MANDATORY表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常PROPAGATION_REQUIRED_NEW表示当前方法必须运行在它自己的事务中。

14、一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager 的话,则需要访问 TransactionManagerPROPAGATION_NOT_SUPPORTED表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用 JTATransactionManager 的话,则需要访问TransactionManagerPROPAGATION_NEVER表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,传播行为传播行为含义含义则会抛出异常PROPAGATION_NESTED表示如

15、果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与 PROPAGATION_REQUIRED 一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务注:以下具体讲解传播行为的内容参考自 Spring 事务机制详解 (1)PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 /事务属性 PROPAGATION_REQUIREDmethodAmethodB();/事务属性 PROPAGATION_REQUIRE

16、DmethodB使用 spring 声明式事务,spring 使用 AOP 来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。单独调用 methodB 方法:main metodB(); 相当于Main Connection con=null; try con = getConnection(); con.setAutoCommit(false); /方法调用methodB(); /提交事务mit(); Catch(RuntimeException ex) /回滚事务con.rollback(); finally /释放资源closeCon(); Spring 保证在 methodB 方法中所有的调用都获得到一个相同的连接。在调用 methodB 时,没有一个存在的事务,所以获得一个新的连接,开启了一个新的事务。 单独调用 MethodA 时

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号