一、事务概念
事务是恢复和并发控制的基本单位。
在企业级软件开发中,事务管理是必不可少的的一项技术,以保证数据的完整性和一致性。
事务具有如下特性:(ACID)
A :Atomic 原子性。要么全部完成,要么全部失败。
C :Consistency 一致性。业务上下流一致,不会存在上流成功,下流失败。
I :Isolation 隔离性。不同事务间相互隔离。
D :Durability 持久性。事务一旦完成,结果便是固定了,无论系统发生任何错误。
二、Spring事务
2.1 Spring事务管理器
Spring事务管理是由实现接口org.springframework.transaction.PlatformTransactionManager
的类进行事务管理的。
Spring为各个平台提供了对应的事务管理器,如:DataSourceTransactionManager(JDBC事务管理)
、JpaTransactionManager(JPA事务管理器)
、HibernateTransactionManager
等等。
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;
void commit(TransactionStatus var1) throws TransactionException;
void rollback(TransactionStatus var1) throws TransactionException;
}
2.1.1 事务属性定义TransactionDefinition
PlatformTransactionManager
通过getTransaction(TransactionDefinition definition)
方法来得到事务,入参为TransactionDefinition
,该类具体代码如下:
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;
//获取事务传播行为
int getPropagationBehavior();
//获取事务隔离级别
int getIsolationLevel();
//事务超时时间
int getTimeout();
//是否只读
boolean isReadOnly();
//获取事务名称
String getName();
}
2.1.2 事务传播行为PropagationBehavior
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
Spring定义七种事务传播行为:
传播行为 | 含义 |
---|---|
REQUIRED(需要) | (Default)如果当前存在事务,则在当前事务运行,否则创建一个新的事务。 |
REQUIRES_NEW(需要新的) | 创建新的事务,如果当前存在事务,挂起当前存在的事务。 |
SUPPORTS(支持) | 支持当前事务,如果当前事务不存在,则以非事务方式执行。 |
NOT_SUPPORTED(不支持) | 以非事务方式执行,如果当前事务存在,则挂起当前事务。 |
MANDATORY(强制) | 支持当前事务,如果当前事务不存在,则抛出异常。 |
NEVER(从不) | 以非事务方式执行,如果当前事务存在,则抛出异常。 |
NESTED(嵌套) | 如果当前事务存在,则在嵌套事务中执行,否则与REQUIRED一致。 |
2.1.3 事务隔离级别
事务隔离级别是为了处理若干个并发的事务之间的隔离程度。
Spring定义五种事务隔离级别:
隔离级别 | 含义 |
---|---|
DEFAULT | (Default)使用底层数据库的默认隔离级别。 |
READ_UNCOMMITTED | 读未提交。可能发生脏读、不可重复读、幻读。 |
READ_COMMITTED | 读已提交。可能发生不可重复度、幻读。 |
REPEATABLE_READ | 可重复读。可能发生幻读。 |
SERIALIZABLE | 可串行化读。不会发生以上的问题,但性能降低。 |
- 脏读:读取到另一个事务回滚前的脏数据。
- 不可重复读:发生在一个事务的查询中,读取到另一个事务的更新数据。
- 幻读:幻读是不可重复读的一种特殊情况,侧重于增删的情况下。当一个事务(T1)读取几行记录后,另一个并发事务(T2)插入了一些记录时,幻影读就发生了。