第五章、Spring的事物管理
5.1 Spring 事物管理概述
5.1.1 事物管理的核心接口
Spring事物管理所涉及的3个核心接口
PlatformTransactionManager
- TransactionStatus getTransaction(TransactionDefinition definition) 用于获取事物状态信息。
- void commit(TransactionStatus status) 用于提交事务
- void rollback(TransactionStatus status)用于回滚事务
TransactionStatus对象表示一个事务,它被关联在当前执行的线程上。
PlatformTransactionManager接口只是代表事务管理的接口,它并不知道底层是如何管理事务的,它只需要事务管理提供上面的3个方法,具体如何管理事务则由它的实现类来完成。
- org.springframework.jdbc.datasource.DataSourceTransactionManager 用于配置JDBC数据源的事物管理器
- org.springframework.orm.hibernate4.HibernateTransactionManager 用于配置Hibernate的事物管理器
- org.springframework.transaction.jta.JtaTransactionManager 用于配置全局事物管理器
TransactionDefinition
事物定义的对象,该对象中定义了事务规则,并提供获取事物相关信息的方法。
- String getName() — 获取事物对象名称
- int getIsolationLevel() — 获取事物的隔离级别 ---- 事务的隔离级别详解
- int getPropagationBehavior() — 获取事物的传播行为
- int getTimeout() — 获取事物的超时时间
- boolean isReadOnly() — 获取事物是否可读
事物的传播行为是指在同一个方法中,不同操作前后所使用的事务。
属性名称 | 值 | 描述 |
---|---|---|
PROPAGATION_ REQUIRED | REQUIRED | 当前方法必须运行在一个事务环境中,如果已处于事务环境,直接使用,否则新开启一个事务 |
PROPAGATION_SUPPORTS | SUPPORTS | 处于事务环境则使用当前事务,否则不使用事务 |
PROPAGATION_MANDATORY | MANDATORY | 必须处于当前事务环境中,否则将抛出异常 |
PROPAGATION_REQUIRED_NEW | REQUIRED_NEW | 必须在新事物中运行,如果处在事务中,暂停当前事务,在启动新的事物之后执行该方法,不在事务环境中,启动新的事务后执行方法 |
PROPAGATION_NOT_SUPPORTED | NOT_SUPPORTED | 总是以非事务状态执行 |
PROPAGATION_NEVER | NEVER | 不支持事务,处于事务会抛异常 |
PROPAGATION_NESTED | NESTED | 总会启动新的事务,有可能事务嵌套 |
TransactionStatus
该接口提供事务状态API, 描述某一时间点上事务的状态信息。
- void flush(); 刷新事务
- boolean hasSavepoint(); 获取事物是否存在保存点
- boolean isCompleted(); 获取事务是否完成
- boolean isNewTransaction(); 获取是否是新事务
- boolean isRollbackOnly(); 获取是否回滚
- void setRollbackOnly(); 设置事务回滚
5.1.2 事务的管理方式
- 传统的编程式事务管理
通过编写代码实现的事物管理,包括定义事物的开始、正常执行后的事物提交和异常时的事物回滚。 - 声明式事务管理
通过AOP技术实现的事物管理,主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码织入到业务目标类中。
5.2 声明式事务管理
5.2.1 基于XML方式的声明式事务
基于XML方式的声明式事务管理通过在配置文件中配置事务规则的相关声明来实现。提供tx命名空间来配置事务,tx命名空间下提供了<tx:advice>
元素来配置事务的通知(增强处理)。当使用<tx:advice>
配置事务的增强处理后,可以通过编写的AOP配置,让Spring自动对目标生成代理。
<tx:advice> //需要指定id 和transaction-manager(事务管理器)属性
<tx:advice>---》---<tx:attributes> //子元素可配置多个<tx:method>子元素配置执行事务的细节
attributes的子元素<tx:method>
属性名称 | 描述 |
---|---|
name | 指定了与事务属性相关的方法名,支持使用通配符 get*等 |
propagation | 指定事务的传播行为,默认为REQUIRED |
isolation | 事务的隔离级别 DEFAULT、 READ_UNCOMMITTED、 READ_COMMITTED、 REPEATABLE_READ、 SERIALIZABLE 默认值是DEFAULT |
read-only | 是否只读 默认false |
timeout | 指定事务的超时时间 |
rollback-for | 指定触发事务回滚的异常类,指定多个异常类时,之间用逗号隔开 |
no-rollback-for | 指定不触发事务回滚的异常类 |
5.2.2 基于Annotation方式的声明式事务
- Spring容器中注册事务注解驱动
<tx:annotation-driven transaction-manager="transactionManager"/>
- 在类或方法上添加注解 @Transaction
在类上,所有方法都起作用。
参数名称 | 描述 |
---|---|
value | 指定事务管理器 |
transationManager | 事务的限定符值,用于确定目标事务管理器,匹配特定的限定值(或者Bean的name值)默认为"" 别名为value |
isolation | 隔离级别 |
noRollbackFor | 遇特定异常强制不会滚事务 |
noRollbackForClassName | 指定遇到多异常时强制不回滚事务 |
propagation | 指定事务的传播行为 |
read-only | 任务是否只读 默认false |
rollbackFor | 指定异常强制回滚 |
rollbackForClassName | 可以指定多个异常回滚 |
timeout | 事务超时时间 |