Spring中的事务工作详解版权声明

原创
小哥 3年前 (2022-11-11) 阅读数 68 #大杂烩

这里的主要介绍。Spring有关事务管理的一些理论知识,请参阅之前在实际操作中的博客文章。:

http://www.cnblogs.com/longshiyVip/p/5061547.html

1. 交易简介:

事务管理是企业应用程序开发中确保数据完整性和一致性的关键技术。

事务是一系列被视为单个工作单元的操作。这些行动要么全部完成,要么全部无效。

2. 交易的四个关键属性(ACID)

① 原子性(atomicity):事务是由一系列操作组成的原子操作。事务的原子性确保了操作要么完成,要么完全无效。
② 一致性(consistency):完成所有事务操作后,事务即被提交。数据和资源处于符合业务规则的一致状态。
③ 隔离性(isolation):可能有许多事务同时处理相同的数据,因此所有事务都应该与其他事务隔离,以防止数据损坏。
④ 持久性(durability):一旦事务完成,无论出现任何系统错误,其结果都不应受到影响。通常,事务的结果被写入持久内存。

3. Spring交易管理

作为企业应用框架,Spring在不同的事务管理中API上面定义了抽象层。虽然应用程序开发人员不必了解底层事务管理API,您可以使用它。Spring交易管理机制。

Spring支持编程事务管理(也称为编码事务),还支持声明性事务管理。

程序化事务管理 :事务管理代码嵌入在业务方法中,以控制事务的提交和回滚,在编程事务中,每个业务操作中必须包含额外的事务管理代码。

声明性事务管理 :大多数情况下比程序化事务管理更好用。它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP模块化方法。Spring通过Spring AOP框架支持声明性事务管理。

4. Spring事务管理器

Spring与直接管理事务不同,有多种事务管理器将事务管理职责委托给JTA或者由其他持久性机制提供的与平台相关的事务实现。每个事务管理器充当特定平台的事务实现的门面,这允许用户Spring在中使用事务时,几乎不需要关注实际的事务实现是什么。

Spring许多内置事务管理器实现可用:

  • DataSourceTransactionManager 位于org.springframework.jdbc.datasource在包中,数据源事务管理器提供了一个。javax.sql.DataSource交易管理,Spring JDBC抽象框架,iBATIS或MyBatis框架的交易管理;
  • JdoTransactionManager 位于org.springframework.orm.jdo包装,提供一对单独的javax.jdo.PersistenceManagerFactory交易管理,集成JDO框架时的交易管理;
  • JpaTransactionManager 位于org.springframework.orm.jpa包装,提供一对单独的javax.persistence.EntityManagerFactory事务支持,用于集成JPA实现框架时的交易管理;
  • HibernateTransactionManager 位于org.springframework.orm.hibernate3包装,提供一对单独的org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的交易管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+仅版本支持Hibernate 3.2+版本;
  • JtaTransactionManager 位于org.springframework.transaction.jta打包,为分布式事务管理提供支持,并将事务管理委托给Java EE应用服务器事务管理器;
  • OC4JjtaTransactionManager 位于org.springframework.transaction.jta包中,Spring提供的对OC4J10.1.3+应用服务器交易经理的适配器,用于支持应用服务器提供的高级事务;
  • WebSphereUowTransactionManager 位于org.springframework.transaction.jta包中,Spring提供的对WebSphere 6.0+应用服务器交易经理的适配器,用于支持应用服务器提供的高级事务;
  • WebLogicJtaTransactionManager 位于org.springframework.transaction.jta包中,Spring提供的对WebLogic 8.1+应用程序服务器事务管理器适配器,用于支持应用程序服务器提供的高级事务。

Spring不仅提供这些事务管理器,还提供JMS交易管理等的管理者,Spring提供一致的事务抽象,如图所示。9-1所示。

图9-1 Spring事务管理器

接下来,让我们学习如何使用Spring事务管理器在配置文件中定义:

声明支持本地事务:

a) JDBC 及iBATIS 、MyBatis 框架事务管理器


    

通过dataSource该属性指定事务管理的需要。个人。javax.sql.DataSource对象幕后DataSourceTransactionManager通过调用java.sql.Connection管理交易,后者已经完成DataSource获得。通过调用连接的commit()方法提交事务。类似地,当事务失败时,它被调用。rollback()方法回滚。

b) Jdo 事务管理器


    

通过persistenceManagerFactory属性指定事务管理的需要。javax.jdo.PersistenceManagerFactory对象。

c) Jpa 事务管理器


    

通过entityManagerFactory属性指定事务管理的需要。javax.persistence.EntityManagerFactory对象。

还需要为entityManagerFactory对象指定jpaDialect属性,该属性指定如何获取与事务管理相关的行为,如连接对象、打开事务和关闭事务。


        ……
        

d) Hibernate 事务管理器


    

在幕后HibernateTransactionManager 委托事务管理职责 org.hibernate.Transaction对象,而后者来自Hibernate Session在中获得。当事务成功完成时, HibernateTransactionManager 将会调用 Transaction 对象的commit()方法提交事务。类似地,当事务失败时,它被调用。 **Transaction** 的rollback()方法回滚。

Spring 支持全球交易:

**a) Jta 事务管理器**



  
  
    
  

“dataSource”Bean表示从JNDI在中获取的数据源txManager是JTA事务管理器,其中属性transactionManagerName指定了JTA交易经理的JNDI名称,从而将事务管理委托给事务管理器。

  1. 定义事务属性

在Spring在中,声明性事务由事务属性定义,这些属性描述了如何将事务策略应用于方法。事务属性包含5尽管Spring提供了多种声明性事务机制,但都依赖于这五个参数来控制事务策略的管理方式。声明性交易 传播行为、隔离级别、只读提示、事务超时和回滚规则。 定义。

Spring传播交易的行为:

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如,一个方法可以继续在现有事务中运行,也可以打开一个新事务并在自己的事务中运行。

事务的传播行为可以由传播属性指定。Spring定义了7沟通行为类型:

Spring支持的事务传播行为

传播行为

含义

PROPAGATION_MANDATORY

指示该方法必须在事务中运行,如果当前事务不存在,则引发异常。

PROPAGATION_NESTED

指示如果事务已存在,则该方法将在嵌套事务中运行。嵌套事务可以独立于当前事务提交或回滚。如果当前事务不存在,则其行为与PROPAGATION_REQUIRED相同的请注意,供应商对这种通信行为的支持各不相同。您可以参考资源管理器的文档以确认它们支持嵌套事务。

PROPAGATION_NEVER

指示当前方法不应在事务上下文中运行。如果事务当前正在运行,则会引发异常。

PROPAGATION_NOT_SUPPORTED

指示该方法不应在事务中运行。如果存在当前事务,则当前事务将在方法运行时挂起。如果使用JTATransactionManager然后您需要访问TransactionManager

PROPAGATION_REQUIRED

指示当前方法必须在事务中运行。如果当前事务存在,则该方法将在该事务中运行。否则,将启动新事务

PROPAGATION_REQUIRED_NEW

指示当前方法必须在其自己的事务中运行。将启动新事务。如果存在当前事务,则在执行该方法期间暂停当前事务。如果使用JTATransactionManager然后您需要访问TransactionManager

PROPAGATION_SUPPORTS

指示当前方法不需要事务上下文,但如果存在当前事务,则该方法将在该事务中运行。

其中PROPAGATION_REQUIRED是默认传播属性。

Spring事务的隔离级别

隔离级别定义了事务可能受到其他并发事务影响的程度。在一个典型的应用程序中,多个事务并发运行,并且通常操作相同的数据来完成各自的任务。虽然有必要,但并发会导致以下问题。

并发事务引起的问题可分为以下三类:

脏读(Dirty reads) :当一个事务读取另一个事务覆盖但尚未提交的数据时,会发生脏读取。如果稍后回滚重写,则第一个事务获得的数据无效。

不可重复读取取(Nonrepeatable read) :不可重复读取取发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间更新了数据

幻读(Phantom read) :幻读与不可重复读取取类似。它发生在一个事务(T1)读取了几行数据,然后是另一个并发事务。(T2)插入某些数据时。在后续查询中,第一个事务(T1)您将发现更多不存在的记录。

Spring事务的隔离级别

  1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认隔离级别,使用数据库默认事务隔离级别。.
    其他四个是相关的JDBC的隔离级别
  2. ISOLATION_READ_UNCOMMITTED: 这是事务的最低隔离级别,允许外部事务查看该事务的未提交数据。
    这种隔离级别会产生脏读,不可重复读取取和幻像读。
  3. ISOLATION_READ_COMMITTED: 确保一个事务修改的数据在被另一个事务读取之前被提交。另一个事务无法读取该事务未提交的数据。
  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读取取。但是可能出现幻像读。
    除了确保一个事务无法读取另一个事务的未提交数据之外,它还确保避免以下情况。(不可重复读取取)。
  5. ISOLATION_SERIALIZABLE 这是最昂贵但最可靠的事务隔离级别。处理事务以进行顺序执行。
    除了防止脏读,不可重复读取取外,还避免了幻像读。

Spring事务的只读

“只读事务”不是强制选项,它只是提示数据库驱动程序和数据库系统的“提示”,该事务不包含更改数据的操作。JDBC驱动程序和数据库可能会根据这种情况对事务进行一些特定的优化,例如,没有设置相应的数据库锁来减轻事务对数据库的压力,毕竟事务也会消耗数据库的资源。“只读事务”只是性能优化的推荐配置,并不强制您这样做。

Spring事务的事务超时

为了使应用程序更好地运行,事务不能运行太长时间。因此,声明性事务的第四个特性是超时。

Spring事务的回滚规则

默认情况下,事务仅在遇到运行时异常时回滚,而在遇到检查类型异常时不会回滚,但您也可以声明事务回滚,就像它们遇到特定的检查类型异常一样。类似地,您还可以声明事务遇到未回滚的特定异常,即使它们是运行时异常。

怀有希望!!

原始地址: https://www.cnblogs.com/longshiyVip/p/5061637.html

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除