第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实现的全局事务的高级视图:

20191105 《Spring5高级编程》笔记-第9章-LMLPHP

9.2 PlatformTransactionManager的实现

org.springframework.transaction.PlatformTransactionManager 接口使用 TransactionDefinitionTransactionStatus 接口来创建和管理事务。

9.3 分析事务属性

事务的四个属性:ACID(原子性、一致性、隔离性、持久性)。对事务的原子性、一致性和持久性是无法控制的(或者说由数据库控制)。但是,可以控制事务的传播和超时,以及配置事务是否应为制度并指定隔离级别。

Spring将以上事务的设置封装在TransactionDefinition接口中。该接口被用于Spring的事务支持的核心接口,即PlatformTransactionManager接口,该接口的实现在特定平台(如JDBC或JTA)上执行事务管理。其核心方法PlatformTransactionManager.getTransaction(TransactionDefinition definition)TransactionDefinition 作为参数,并返回一个TransactionStatus接口。TransactionStatus接口用于控制事务执行,即设置事务结果并检查事务是否完成或是否为新事务。

9.3.1 TransactionDefinition接口

TransactionDefinition接口控制事务的属性。

TransactionDefinition.getIsolationLevel() 返回事务隔离级别:

20191105 《Spring5高级编程》笔记-第9章-LMLPHP

TransactionDefinition.getIsolationLevel() 返回事务传播类型:

20191105 《Spring5高级编程》笔记-第9章-LMLPHP

9.3.2 TransactionStatus接口

TransactionStatus接口允许事务管理器控制事务的执行。

TransactionStatus.setRollbackOnly() 会导致回滚并结束活动事务。

9.4 示例代码的示例数据模型和基础结构

9.4.2 示例数据模型和通用类

org.springframework.transaction.annotation.Transactional

@Transactional注解的属性:

20191105 《Spring5高级编程》笔记-第9章-LMLPHP

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>
05-11 20:26