Spring 中事务的传播属性详解
本文主要介绍了 Spring 事物传播属性,供大家参考。
在使用 Spring 时,大部分会用到他的声明式事务,简单的在配置文件中进行一些规则配
置,利用 Spring 的 AOP 功能就能轻松搞定事务问题;这里面就涉及到一个事务的传播
属 性 问 题 Propagation , 它 在 TransactionDefinition 接 口 中 定 义 , 以 供
PlatfromTransactionManager 使用,PlatfromTransactionManager 是 spring 事务管
理的核心接口。
TransactionDefinition
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
}
getTimeout()
方法,它返回事务必须在多少秒内完成。
isReadOnly(),事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务
是只读的。
getIsolationLevel()方法返回事务的隔离级别,事务管理器根据它来控制另外一个
事务可以看到本事务内的哪些数据。
在 TransactionDefinition 接 口 中 定 义 了 五 个 不 同 的 事 务 隔 离 级 别 ,
ISOLATION_DEFAULT 这是一个 PlatfromTransactionManager 默认的隔离级别,使用
数 据 库 默 认 的 事 务 隔 离 级 别 . 另 外 四 个 与 JDBC 的 隔 离 级 别 相 对 应 ,
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务
可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
在 TransactionDefinition 接口中共有 7
种选项可用:
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这
是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就
把当前事务挂起。
PROPAGATION_NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。