真的是你也能看懂的 Spring 事务管理

这是一篇简单分析 Spring 事务管理的文章。

先把老生常谈的概念总结下

事务

事务:事务是逻辑上的一组操作,要么全都执行,要么全都不执行。

事务的特性(ACID)

  • 原子性(Atomic):事务是执行的最小单位,原子性要求整个事务要么全都执行成功,要么全都失败。
  • 一致性(Consistency):执行事务后,总量数据保持一致。(可能不太清楚,举个栗子:A和B账户各有100元,总金额200元,现在A给B转账100元成功,在不进行其他任何操作的情况下,A和B的总金额依然为200元。)
  • 隔离性(Isolation):并发事务执行,事务之间互不影响。
  • 持久性(Durability):事务一旦提交成功则表示数据已经永久存在,即使数据库故障对数据也不应该有影响。

    事务隔离级别

  • 未提交读:可以读取其它事务未提交的数据,现在基本没有在用,会发生脏读的问题。
  • 已提交读:可以读取其它事务已经提交的数据,Oracle数据库默认此级别,会发生幻读的问题。
  • 可重复读:多次多次数据依然一致(前提自己没修改过,自己修改过的话读到的是自己修改后最新的),不会读取到其他事务提交的信息,此时级别需要注意如果多线程同时修改相同的数据,结果会以最后一个事务提交的数据为准。mysql数据库默认为此级别。
  • 串行化:单线程事务,同时只能一个线程开启事务,并发量较大时会是很大的瓶颈。

Spring 事务管理的几大接口

PlatformTransactionManager(事务管理器)

Spring 定义了事务管理平台,PlatformTransactionManager为事务管理的根接口,然后针对不同的数据源实现了常用的事务管理。
接口定义如下:

1
2
3
4
5
6
7
8
public interface PlatformTransactionManager {
//获取事务状态
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
//提交事务
void commit(TransactionStatus var1) throws TransactionException;
//回退事务
void rollback(TransactionStatus var1) throws TransactionException;
}

Spring 为事务管理接口进行了一个抽象实现 org.springframework.transaction.support.AbstractPlatformTransactionManager,里面定义处理了对事务的大部分操作框架,同时Spring已经为我们实现了常用的事务管理,例如

接口 说明
org.springframework.jdbc.datasource.DataSourceTransactionManager 此类为Spring jdbc 和 mybatis 进行事务管理
org.springframework.orm.jpa.JpaTransactionManager 此类是Spring Jpa 专用的事务管理

DataSourceTransactionManager 实际就是针对Java JDBC核心接口进行的事务管理实现,翻翻代码大部分还是可以读懂的。

TransactionDefinition(事务信息定义)

org.springframework.transaction.TransactionDefinition类定义了事务的相关信息,

  • 事务隔离级别(默认的就是数据库默认的)
  • 传播行为
  • 超时
  • 只读
1
2
3
4
5
6
7
8
9
10
11
12
public interface TransactionDefinition {
//获取事务的传播行为
int getPropagationBehavior();
//获取事务的隔离级别
int getIsolationLevel();
//获取事务超时时间
int getTimeout();
//是否是只读的事务
boolean isReadOnly();
//获取事务的名称
String getName();
}

TransactionStatus(事务状态)

org.springframework.transaction.TransactionStatus事务状态的主要接口,用来获取或判断事务的相应状态信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface TransactionStatus extends SavepointManager, Flushable {
//是否是新建事务
boolean isNewTransaction();
//是否有还原点
boolean hasSavepoint();
//设置为只回滚
void setRollbackOnly();
//是否为只回滚
boolean isRollbackOnly();
//刷新
void flush();
//是否已完成
boolean isCompleted();
}