这里写目录标题
1 事务管理的核心接口
在spring-tx-5.3.12.jar包中,Spring提供了用于事务管理的依赖包,在包org.springframework.transaction中有三个接口文件:PlatformTransactionManager、TransactionDefinition、TransactionStatus。
1.1 PlatformTransactionManager
PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。
package org.springframework.transaction;
import org.springframework.lang.Nullable;
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
方法 | 说明 |
---|---|
TransactionStatus getTransaction(TransactionDefination defination) | 获取事务的状态信息 |
void commit(TransactionStatus status) | 提交事务 |
void rollback(TransactionStatus status) | 回滚事务 |
注意
PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类;
- org.springframework.jdbc.datasource.DataSourceTransactionManager:用于JDBC或者MyBatis的事务管理。
- org.springframework.orm.hibernate5.HibernateTransactionManager:用于Hibernate的技术管理。
- org.springframwork.transaction.jta.JtaTransactionManager:用于配置全局事务管理。
1.2 TransactionDefinition
TransactionDefinition 是事务的定义信息对象,该对象定义了事务规则,并提供了获取事务相关信息的方法:
package org.springframework.transaction;
import org.springframework.lang.Nullable;
//事务的定义信息
public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
int TIMEOUT_DEFAULT = -1;
default int getPropagationBehavior() {
return PROPAGATION_REQUIRED;
}
default int getIsolationLevel() {
return ISOLATION_DEFAULT;
}
default int getTimeout() {
return TIMEOUT_DEFAULT;
}
default boolean isReadOnly() {
return false;
}
@Nullable
default String getName() {
return null;
}
static TransactionDefinition withDefaults() {
return StaticTransactionDefinition.INSTANCE;
}
}
方法 | 说明 |
---|---|
String getName() | 获取事务对象的名称 |
int getIsolationLevel() | 获得事务的隔离级别 |
int getPropogationBehavior() | 获得事务的传播行为 |
int getTimeout() | 获得超时时间 |
boolean isReadOnly() | 是否只读 |
1.事务隔离级别
事务的四大特性:原子性、一致性、隔离性、持久性。
设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。
- ISOLATION_DEFAULT
- ISOLATION_READ_UNCOMMITTED Read uncommitted(读未提交)
- ISOLATION_READ_COMMITTED Read committed(读提交)
- ISOLATION_REPEATABLE_READ Repeatable read(可重复读取)
- ISOLATION_SERIALIZABLE Serializable(可序化)
2.事务传播行为
事物的传播行为是指在同i一个方法中,不同操作前后所使用的事务。传播行为如下所示:
在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务。通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring默认传播行为是REQUIRED。
1.3 TransactionStatus
TransactionStatus接口是事务的状态,描述了某一时间点上事务的状态信息。该接口中包含6个方法,具体如下:
- void flush():刷新事务。
- boolean hasSavepoint():获取是否存在保存点。
- boolean isCompleted():获取事务是否完成。
- boolean isNewTransaction():获取是否是新事务。
- boolean isRollbackOnly():获取是否回滚。
- void setRollbackOnly():设置事务回滚。
2 事务管理的方式
Spring的事务管理分为两种方式:一种是传统的编程式事务管理,一种是声明式事务管理。
-
编程式事务管理
通过编写代码来实现事务的管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。 -
声明式事务管理
通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个”切面“代码单独编写,然后通过AOP技术将事务管理的切面代码织入业务目标代码中去。
声明式事务管理最大的优点在于无需通过编程的方式来管理事务,只需要在配置文件中进行相关的事务规则声明,就可以将事务规则运用到业务逻辑中去。这样的话在开发中,更加专注于核心业务代码的编写,在一定程度上减少了工作量,提高了开发效率。所以在实际开发中,通常推荐使用声明式事务管理。