background image

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

 

:以非事务方式执行,如果当前存在事务,则抛出异常。