Spring事务_事务管理的支持-04
- Spring 为事务管理提供一致的编程模板,在高层次建立统一的事务抽象。
- 不管选择SpringJDBC、Hibernate、JPA还是ibatis,Spring都可以统一的编程模型进行事务管理。
Spring像DAO一样提供事务处理模板,TransTemplate并配合事务回滚TranscationCallBack指定具体的操作就可以通过编程方式实现事务管理。而无需关注资源获取、复用、释放、事务同步和异常处理。
Spring事务的管理两点是声明式事务管理。
事务管理关键抽象
-
TransationDefinition
定义了Spring兼容的事务属性,这些属性对事务管理控制的若干方面进行配置 1.事务隔离 当前事务和其他事务的隔离程度,定义了和java.sql.Connection接口中同名的4个隔离级别。 2.事务传播 通常在一个事务中执行的所有代码都会在运行于同一事务上下文中。但是Spring提供了几 种可选的事务传播类型:简单的参与到现有的事务中,或者挂起当前事务或者创建一个新 事务。在Spring中传播行为是预告ie重要的概念。 3.事务超时 设置事务默认超时,到超时时间就会抛出异常。 4.只读状态 在只读状态中更改数据就是报错
-
TransactionStatus
代表一个事务的具体运行状态。事务管理器通过该接口获取事务的运行期的状态信息,也可以 通过该接口间接的回滚事务,它相比于在抛出异常时回滚事务的方式更具有可控性。该接口继 承与SavepointManager接口,SavepointManager接口基于JDBC3.0保存点的分段事务控 能力提供嵌套事务的机制。 TransactionStatus扩展了SavepointManager并提供一下的方法 1.boolean hasSavepoint() 当前的不是都是否在内部创建了一个保存点,保存点是为了支持Spring的嵌套事务而创建的。 2.boolean isNewTransaction() 判断一个事务是否为新的事务。 3.boolean isCompleted() 判断事务是否已结束 4.boolean isRollbackOnly() 当前事务是否已经被标示为rollback-only 5.void setRollbackOnly() 将当前事务设置为rollback-only,通过该标识通知事务管理器只能将事务回滚,事务 管理器将显式调用回滚命令或抛出异常的方式回滚事务。
-
PlatformTransactionManager
PlatformTransactionManager只定义了三个接口方法,是SPI(service provider Interface)高层次的接口方法。可以像Spring容器总普通Bean一样对待 PlatformTransactionManager实现者。 1.TransactionStatus getTranszction(TransactionDefinition definition) 该方法根据事务定义信息从事务环境中返回一个已存在的事务,或者创建一个新的 事务,并用TransactionStatus描述这个事务的状态。 2.commit(TransactionStatus status) 根据事务的状态提交事务,如果事务状态已经被标识为rollback-only,该方法执行一个 回滚事务操作。 3.rollback(TransactionStatus status) 将事务回滚
Spring的事务管理器实现类
Spring将事务管理委托给底层具体的持久化实现框架完成,因此,Spring为不同的持久化框架
提供了PlatformTransactionManager接口的实现类
事务 | 说明 |
---|---|
org.springframework.orm.jpa.JpaTranszctionManager | 使用JPA持久化使用该事务管理器 |
org.springframework.orm.hibernate3.HibernateTransactionManager | Hibernate3.o事务管理器 |
org.springframework.jdbc.datasource.DataSourceTransactionManager | SpringJdbc或ibatis等基于DataSource数据源持久化技术时使用管理器 |
org.springframework.orm.jdo.JdoTransactionManager | 使用JDO持久化使用该事务管理器 |
org.springframework.transaction.jta.JtaTranszctionManager | 具有多个数据源的全局事务使用事务管理器。 |
-
SpringJDBC 和iBatis
<!--定义一个DBCP的数据源--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/sampledb" p:username="root" p:password="123qwe" /> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"></bean>
在幕后,DateSourceTransactionManager使用DateSource的Connection的commit(),rollBackZ()等方法实现事务的管理。
-
其他每个实现都和第三方的技术相关;
- Jpa通过javax.persistence.EntityTransaction管理JPA的事务,因此要配置一个JPA事务管理器,必须先提供一个DataSource数据源,然后配置一个EntityManagerFactory,最后才配置JpaTransactionManager.
- Hibernate3.0使用org.hibernate.Session封装Connection,所以需要一个能够创建Session的SessionFactory.
- Jta,如果希望在JavaEE容器中使用JTA,通过JNDI和Spring的JtaTranszctionManager获取一个容器管理的DataSource.JtaTracsactionManager不需要知道DataSource和其他特定的资源,因为它引用容器提供的全局事务管理。
Spring的事务同步管理器
Spring将JDBC的Connection、Hibernate的Session等访问数据库的连接或者会话统称为资源。
这些资源同一时刻是不能多线程共享的,为了让Dao,Service类可能做到singleton,Spring的
事务同步管理器类org.springframework.transaction.support.TransactionSynchron
Manager使用ThreadLocal为不同事务线程提供独立的资源副本,同时维护事务配置的属性和
运行状态信息。同步事务管理器是Spring事务管理的基石部分,用户使用编程式还是声明式都
离不开同步管理器。
- Spring框架为不同的持久化技术提供了一套从TransactionSynchronizationManager中获取对应线程绑定资源的工具
持久化技术 | 线程绑定资源获取工具 |
---|---|
SpringJdbc或ibatis | org.springframework.jdbc.datasource.DataSourceUtils |
Hibernate3.0 | org.springframework.orm.hibernate3.SessionFactoryUtils |
JPA | org.springframework.orm.jpa.EntityManagerFactoryUtils |
JDO | org.springframework.orm.jdo.PersistenceManagerFactoryUtils |
1. 这些工具类提供了静态方法,通过这些静态方法可以获取和当前线程绑定的资源。
2. 直接从sessionFactory或者DataSource获取到的不能获得和当前线程绑定的资源。
3. Spring为不同的持久化技术提供了模板类,模板类在北部通过资源过去工具类间接访问
TransactionSynchronizationManager中线程绑定资源。
4. TransactionSynchronizationManager将Dao、Service类中影响线程安全的所有‘状态’
统一抽取到该类中,并用ThreadLocal进行替换,从此使用模板的Dao和Service变成了线程安全状态。
Spring的事务传播行为
当我们调用一个基于Spring的Service接口方法时,它将运行与Spring管理的事务环境中,
Service接口方法会在内部调用其他的Service接口方法,共同完成一个完成的业务操作,
因此就会产生服务接口方法嵌套调用的情况,Spring通过事务差U宁波行为控制当前事务如何传播
到被嵌套调用的目标服务接口方法中。
事务传播是Spring进行事务管理的重要概念。
- Spring在TransactionDefinition接口中规定了7中类型的事务传播行为,规定了事务方法和事务方法发生嵌套调用时事务如何传播的。
事务传播行为类型 | 说明 |
---|---|
propagation_required | 如果当前没有事务,就新建一个事务,如果已经存在,就加入到存在的事务中,这是最常见的选择 |
propagation_supports | 支持当前的事务,如果当前没有事务,就按非事务模式执行 |
propagation_mandatory | 使用当前事务,如果当前没有事务,抛出异常 |
propagation_requires_new | 新建事务,如果当前存在事务,把当前事务挂起 |
propagation_not_supported | 以非事务方式执行,如果当前存在事务,就把当前事务挂起 |
propagation_never | 以非事务方式执行,如果当前存在事务,则抛出异常 |
propagation_nested | 如果当前存在事务,则在嵌套事务内执行,如果没有事务,则执行与propagation_required类似的操作 |
总结
-
Spring对事务的支持-高级抽象接口
- TransactionDefinition - 定义事务属性 - 事务传播类型、隔离级别、超时时间、只读状态 - TransactionStatus - 记录当前事务的状态 - 事务管理类通过此获取事务运行的状态 - PlatformTransactionManager - 定义了三个接口,创建事务,提交,回滚 - 根据TransationDefinition创建事务,返回当前事务运行状态
-
Spring的事务管理器的实现
-Jpa JpaTransactionManager -Hibernate HibernateTransactionManager -Jdbc或iBatis DataSourceTransactionManager -JDO JdoTransactionManager
-
事务同步管理器
访问当前线程中的资源要使用同步资源管理器。Spring的主要事务都建立在同步资源管理器上。
-
事务的传播行为
Spring定义了7种事务传播行为,默认的传播行为是propagation_required, 如果当前没有事务,就新建一个事务,如果已经有事务就最佳到事务当中。