jee第5章 --- Spring的事务管理

5.1 Spring事务管理概述

什么是Spring的事务管理

在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于事务处理的API。Spring的事务管理简化了传统的事务管理流程,减少了开发者的工作量

5.1.1 事务管理的核心接口(PlatformTransactionManager接口)

JAR包

  • spring-tx-4.3.6.RELEASE(Spring提供的用于事务管理的依赖包)

JAR包下的org.springframework.transaction包的三个接口文件

  • PlatformTransactionManager
  • TransactionDefinition
  • TransactionStatus
    jee第5章 --- Spring的事务管理
  1. 关于PlatformTransactionManager接口,Spring提供的平台事务管理器,它提供了操作事务的三个方法:
TransactionStatus getTransaction(TransactionDefinition definition) 用于获取事务状态信息
void commit(TransactionStatus status) 用于提交事务
void rollback(TransactionStatus status) 用于回滚事务
  1. PlatformTransactionManager接口只是代表事务管理的接口,并不知底层是如何管理事务的,具体如何管理事务则由其实现类完成
常见的实现类 作业
org.springframework.jdbc.datasource.DataSourceTransactionManager 用于配置JDBC数据源的事务管理器
org.springframework.orm.hibernate4.HibernateTransactionManager 用于配置Hibernate的事务管理器
org.springframework.transaction.jta.JtaTransactionManager 用于配置全局事务管理器
  1. 关于TransactionDefinition接口,他是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法:
获取事务相关信息的方法 描述
String getName( ); 获取事务对象名称
int getIsolationLevel( ); 获取事务的隔离级别
int getPropagationBehavior( ); 获取事务的传播行为
int getTimeout( ); 获取事务的超时时间
boolean isReadOnly( ); 获取事务是否只读

4.事务的传播行为:在同一个方法中,不同操作前后所使用的事务。它具体有:
jee第5章 --- Spring的事务管理
在事务管理过程中,传播行为可以控制,是否需要创建事务以及如何创建事务,通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring默认传播行为是REQUIRED
5. TransactionStatus接口,是事务的状态,它描述了某一时间点上事务的状态信息。它含6个方法:

方法 描述
void flush(); 刷新事务
boolean hasSavepoint(); 获取是否存在保存点
boolean isCompleted(); 获取事务是否完成
boolean isNewTransaction(); 获取是否为新事务
boolean isRollbackOnly(); 获取事务是否回滚
void setRollbackOnly(); 设置事务回滚

5.1.2 事务管理的方式

Spring事务管理的两种方式

Spring事务管理的方式 具体的方式描述
编程式事务管理 通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚
声明式事务管理 通过AOP技术实现的事务管理,主要思想是将事务作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”植入到业务目标类中

声明式事务管理最大优点:开发者只需在配置文件中声明相关的事务规则,就可将事务应用到业务逻辑中。(推荐! )

5.2 声明式事务管理

如何实现Spring的声明式事务管理

两种实现方式:

  • 基于XML的方式
  • 基于Annotation的方式

5.2.1 基于XML方式的声明式事务

在配置文件中通过<tx:advice>元素配置事务规则。当配置了事务的增强处理后,就可通过编写的AOP配置让Spring自动对目标生成代理。
jee第5章 --- Spring的事务管理
配置<tx:advice>元素的重点是配置<tx:method>子元素,上图中使用灰色标注的是<tx:method>元素中的常用属性。具体如下:
jee第5章 --- Spring的事务管理
作项目的时候,在ch04项目基础上(有jdbc、tx、mysql驱程),再导入aop以及aspectjweaver两个包(不需要aspects包)

jee第5章 --- Spring的事务管理

5.2.2 基于Annotation方式的声明式事务

1.两步骤:

  • 1.在Spring容器中注册事务注解驱动;

<tx:annotation-driven transaction-manager=“transactionManager”/>

  • 2.在需要事务管理的类或方法上使用@Transactional注解。(添加@Transactional的位置即意味着这里要事务管理)
    • 加在Bean类上,则表示事务的设置对整个Bean类的所有方法都有效
    • 加在Bean类中的某个方法上,则表示事务的设置只对该方法有效

2.使用@Transactional注解时,可以通过参数配置事务详情:
jee第5章 --- Spring的事务管理
3.两种声明式事务的对比(导入的包相同)

  • XML方式

jee第5章 --- Spring的事务管理

  • 注解方式
    jee第5章 --- Spring的事务管理jee第5章 --- Spring的事务管理
    learning from my teacher’s ppt