程序猿
微录

Spring 事务详解之 【基础概念】

程序猿微录 发布于: 2020-04-26 11:14 151 0 0 0
首页
文章
专栏
问答
寄语
公告
  • 前往登录

Spring 事务详解之 【基础概念】

程序猿微录 发布于 2020-04-26 11:14 151 0 0 0
所属文册: 数据库事务 文章标签: 事务

Spring Transaction 基础概念

事务:是访问并可能更新数据库中各种数据项的一个最小执行单元。本身具有4大特性ACID:原子性、一致性、隔离性、持久性。具体的详细介绍在数据库详情中查看,在Spring中对事务进行了抽象和扩展

Spring事务定义:TransactionDefinition ,规范了7种传播行为和4种隔离特性和一些基本属性,其中隔离特性是数据库特性,来自Connection,也就是需要数据库支持,传播行为是Spring的扩展

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 = Connection.TRANSACTION_READ_UNCOMMITTED;  

   int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; 

   int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;   

   int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

   int TIMEOUT_DEFAULT = -1;

   // 获取事务传播行为
   int getPropagationBehavior();

   // 获取数据库隔离级别
   int getIsolationLevel();

   // 获取超时时间
   int getTimeout();
   
   // 是否只读
   boolean isReadOnly();

   @Nullable
   String getName();
}

7种事务传播行为

名称 值 描述
PROPAGATION_REQUIRED 0 required 必须存在事务,如果已存在事务则加入,否则创建一个新的事务
PROPAGATION_SUPPORTS 1 supprots 支持原有事务,如果已存在事务则加入,否则不使用事务
PROPAGATION_MANDATORY 2 mandatory 强制托管事务,如果已存在事务则加入,否则直接抛出异常
PROPAGATION_REQUIRES_NEW 3 requires_new 必须使用新事务,新建一个事务,如果已存在事务则挂起旧事务 ,新事务执行完毕后旧事务继续执行
PROPAGATION_NOT_SUPPORTED 4 not_supported 不使用事务,如果已存在事务则挂起旧事务
PROPAGATION_NEVER 5 never 禁止使用事务,如果已存在事务则抛出异常
PROPAGATION_NESTED 6

nested 嵌套使用事务,如果已存在事务,则在旧事务中新建保存点新建子事务,子事务的提交与回滚只会在旧事务的执行到保存点处 ,如果不存在事务则外部新建一个事务

嵌套事务针对2个事务, nested事务在其他事务中使用时,其自身成为子事务,如果其他事物不存在则会新建一个事务仍然保持2个事务,其自身仍然是子事务,永远嵌套在其他事务中

4种数据库隔离级别

名称 值 描述
ISOLATION_DEFAULT -1 Spring默认隔离级别:基于数据库自身的默认隔离级别(四种选择一)
ISOLATION_READ_UNCOMMITTED 1

读未提交,如果其他事务修改了数据,不管事务是否提交,都可以看到最新的数据

多事务时,会读取到回滚前的数据造成脏读(同时读取未提交的数据内容)

ISOLATION_READ_COMMITTED 2

读已提交 ,如果其他事务修改了数据,事务未提交则看不到最新数据,事务已提交则可以看到最新数据

多事务时,只会读到最新数据因此不会产生脏读、但是事务的提交会产生不可重复读(同时读取的数据的内容不一样)

ISOLATION_REPEATABLE_READ 4

可重复读,同条件下可读取相同的数据、如果其他事务修改了数据,也可以读取到最新数据

多事务时,对同一数据的操作同时只有一个事务在执行、因此可以重复读,但是其他事务的提交会产生幻读(同时读取的数据条数不一样)

ISOLATION_SERIALIZABLE 8 串行化,所有事务串行化一个个顺序执行,效率低,安全性最高

Spring中对事务核心的处理,就是基于事务的提交与回滚功能而实现以上特性的编码。目前Spring在JTA中支持分布式事务