第9章 事务管理
一些名词:
- 2PC(2 Phase Commit)
- XA协议
- JTS(Java Transaction Service)
- JCA(Java EE Connector Architecture)
- JPA(Java Persistence API)
- JPQL(Java Persistence Query Language)
Spring支持声明式和编程式事务管理。
9.1 研究Spring事务抽象层
在使用事务时,必须选择是使用全局事务(分布式事务)还是本地事务。本地事务特定于单个事务资源(例如,JDBC连接),而全局事务由容器管理并且可以跨越多个事务资源。
使用JTA实现的全局事务的高级视图:
9.2 PlatformTransactionManager
的实现
org.springframework.transaction.PlatformTransactionManager
接口使用 TransactionDefinition
和 TransactionStatus
接口来创建和管理事务。
9.3 分析事务属性
事务的四个属性:ACID
(原子性、一致性、隔离性、持久性)。对事务的原子性、一致性和持久性是无法控制的(或者说由数据库控制)。但是,可以控制事务的传播和超时,以及配置事务是否应为制度并指定隔离级别。
Spring将以上事务的设置封装在TransactionDefinition
接口中。该接口被用于Spring的事务支持的核心接口,即PlatformTransactionManager
接口,该接口的实现在特定平台(如JDBC或JTA)上执行事务管理。其核心方法PlatformTransactionManager.getTransaction(TransactionDefinition definition)
将TransactionDefinition
作为参数,并返回一个TransactionStatus
接口。TransactionStatus
接口用于控制事务执行,即设置事务结果并检查事务是否完成或是否为新事务。
9.3.1 TransactionDefinition
接口
TransactionDefinition
接口控制事务的属性。
TransactionDefinition.getIsolationLevel()
返回事务隔离级别:
TransactionDefinition.getIsolationLevel()
返回事务传播类型:
9.3.2 TransactionStatus
接口
TransactionStatus
接口允许事务管理器控制事务的执行。
TransactionStatus.setRollbackOnly()
会导致回滚并结束活动事务。
9.4 示例代码的示例数据模型和基础结构
9.4.2 示例数据模型和通用类
org.springframework.transaction.annotation.Transactional
@Transactional
注解的属性:
Spring的JpaTransactionManager
不支持自定义隔离级别。它总是使用底层数据存储的默认隔离级别。如果使用Hibernate作为JPA服务提供程序,可以扩展HibernateJpaDialect
类以支持自定义隔离级别。
9.4.3 使用AOP配置进行事务管理
引入注解之后,在XML中使用AOP名称空间配置基本被弃用了,但是在无法对代码编辑的情况下是很有用的。
9.5 使用编程式事务
编程式事务有两种选择,第一种是将一个PlatformTransactionManager
实例注入到bean中,并直接与事务管理器进行交互。第二种选择是使用Spring提供的org.springframework.transaction.support.TransactionTemplate
类。
在一般情况下建议使用声明式事务。
9.6 使用Spring实现全局事务
在Java中,JTA是实现全局事务的事实标准。
和本地事务一样,Spring支持JTA事务,并从业务代码中隐藏相关逻辑。
9.6.3 Spring Boot JTA
<!--JTA-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>