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();
}
名称 | 值 | 描述 |
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个事务,其自身仍然是子事务,永远嵌套在其他事务中 |
名称 | 值 | 描述 |
ISOLATION_DEFAULT | -1 | Spring默认隔离级别:基于数据库自身的默认隔离级别(四种选择一) |
ISOLATION_READ_UNCOMMITTED | 1 |
读未提交,如果其他事务修改了数据,不管事务是否提交,都可以看到最新的数据 多事务时,会读取到回滚前的数据造成脏读(同时读取未提交的数据内容) |
ISOLATION_READ_COMMITTED | 2 |
读已提交 ,如果其他事务修改了数据,事务未提交则看不到最新数据,事务已提交则可以看到最新数据 多事务时,只会读到最新数据因此不会产生脏读、但是事务的提交会产生不可重复读(同时读取的数据的内容不一样) |
ISOLATION_REPEATABLE_READ | 4 |
可重复读,同条件下可读取相同的数据、如果其他事务修改了数据,也可以读取到最新数据 多事务时,对同一数据的操作同时只有一个事务在执行、因此可以重复读,但是其他事务的提交会产生幻读(同时读取的数据条数不一样) |
ISOLATION_SERIALIZABLE | 8 | 串行化,所有事务串行化一个个顺序执行,效率低,安全性最高 |
Spring中对事务核心的处理,就是基于事务的提交与回滚功能而实现以上特性的编码。目前Spring在JTA中支持分布式事务