Spring事务隔离级别与传播行为
Posted l_learning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务隔离级别与传播行为相关的知识,希望对你有一定的参考价值。
org.springframework.transaction
public interface TransactionDefinition
定义符合 Spring 的事务属性的接口。基于类似于 EJB CMT 属性的传播行为定义。
注意,除非启动实际的新事务,否则不会应用隔离级别和超时设置。 仅 PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW and PROPAGATION_NESTED 可能导致这种情况,在其他情况下指定这些设置通常没有意义。此外,并非所有事务管理器都支持这些高级功能,因此在给定非默认值时可能会引发相应的异常。
read-only flag 适用于任何事务上下文,无论是由实际资源事务支持还是在资源级别以非事务方式运行。在后一种情况下,该标志将仅适用于应用程序中的托管资源, 例如 Hibernate Session.
隔离级别
隔离级别 | 描述 |
---|---|
ISOLATION_DEFAULT | 使用基础数据存储的默认隔离级别。 |
ISOLATION_READ_COMMITTED | 指示防止脏读;可能发生非可重复读取和幻像读取。 |
ISOLATION_READ_UNCOMMITTED | 指示可能发生脏读、非可重复读取和幻像读取。 |
ISOLATION_REPEATABLE_READ | 指示防止脏读和非可重复读;可能会发生幻像读取。 |
ISOLATION_SERIALIZABLE | 指示防止脏读、非可重复读取和幻像读取。 |
ISOLATION_READ_COMMITTED
表示防止脏读;可能发生非可重复读取和幻像读取。
此级别仅禁止事务读取包含未提交更改的行。
ISOLATION_READ_UNCOMMITTED
表示可能发生脏读、非可重复读取和幻像读取。
此级别允许一个事务更改的行在提交该行中的任何更改之前由另一个事务读取(“脏读取”)。如果回滚任何更改,则第二个事务将检索到无效行。
ISOLATION_REPEATABLE_READ
表示防止脏读和非可重复读;可能会发生幻像读取。
此级别禁止事务读取包含未提交更改的行,并且还禁止以下情况:一个事务读取行,第二个事务更改行,第一个事务重新读取行,第二次获取不同的值(“不可重复读取”)。
ISOLATION_SERIALIZABLE
表示防止脏读、非可重复读取和幻像读取。
此级别包括ISOLATION_REPEATABLE_READ中的禁止,并进一步禁止以下情况:一个事务读取满足某个条件的所有行,第二个事务插入满足该条件的行,第一个事务针对同一条件重新读取,在第二次读取中检索其他“幻像”行
传播行为
传播行为 | 描述 |
---|---|
PROPAGATION_REQUIRED | 支持当前事务;如果不存在,请创建一个新。 |
PROPAGATION_REQUIRES_NEW | 创建新事务,暂停当前事务(如果存在)。 |
PROPAGATION_NESTED | 如果当前事务存在,则在嵌套事务中执行,否则行为类似于PROPAGATION_REQUIRED。 |
PROPAGATION_NEVER | 不支持当前事务;如果当前事务存在,则引发异常。 |
PROPAGATION_SUPPORTS | 支持当前事务;如果不存在,则以非事务方式执行。 |
PROPAGATION_NOT_SUPPORTED | 不支持当前事务;而是始终以非事务性方式执行。 |
PROPAGATION_MANDATORY | 支持当前事务;如果当前事务不存在,则引发异常。 |
PROPAGATION_REQUIRED
支持当前事务;如果不存在,请创建一个新。类似于同名的 EJB 事务属性。
这通常是事务定义的默认设置,通常定义事务同步作用域。
PROPAGATION_REQUIRES_NEW
创建新事务,暂停当前事务(如果存在)。类似于同名的 EJB 事务属性。
注意:实际的事务暂停不会在所有事务管理器上开箱即用。这尤其适用于JtaTransactionManager,它要求将其提供给它(在标准Java EE中是特定于服务器的)。javax.transaction.TransactionManager
作用域始终定义自己的事务同步。现有同步将被挂起并相应地恢复。
PROPAGATION_NESTED
如果当前事务存在,则在嵌套事务中执行,否则行为类似于PROPAGATION_REQUIRED。EJB 中没有类似的功能。
注意:实际创建嵌套事务仅适用于特定的事务管理器。开箱即用,这仅适用于在处理 JDBC 3.0 驱动程序时的 JDBC DataSourceTransactionManager。某些 JTA 提供程序可能也支持嵌套事务。
PROPAGATION_NEVER
不支持当前事务;如果当前事务存在,则引发异常。类似于同名的 EJB 事务属性。
请注意,事务同步在某个范围内不可用。
PROPAGATION_SUPPORTS
支持当前事务;如果不存在,则以非事务方式执行。类似于同名的 EJB 事务属性。
注意:对于具有事务同步功能的事务管理器, PROPAGATION_SUPPORTS 与完全没有事务略有不同,因为它定义了同步可能适用的事务范围。因此,相同的资源 (a JDBC Connection, a Hibernate Session, etc) 将在整个指定范围内共享。注意,确切的行为取决于事务管理器的实际同步配置!
一般而言,使用 PROPAGATION_SUPPORTS 用心!特别是,不要依赖 PROPAGATION_REQUIRED or PROPAGATION_REQUIRES_NEW 在 PROPAGATION_SUPPORTS作用域(这可能会导致运行时的同步冲突)。如果这种嵌套是不可避免的,请确保适当地配置事务管理器(通常切换到“实际事务上的同步”)。
PROPAGATION_NOT_SUPPORTED
不支持当前事务;而是始终以非事务性方式执行。类似于同名的 EJB 事务属性。
注意:实际的事务暂停不会在所有事务管理器上开箱即用。这尤其适用于JtaTransactionManager,它要求将其提供给它(在标准Java EE中是特定于服务器的)。javax.transaction.TransactionManager
请注意,事务同步在某个范围内不可用。现有同步将被挂起并相应地恢复。
PROPAGATION_MANDATORY
支持当前事务;如果当前事务不存在,则引发异常。类似于同名的 EJB 事务属性。
请注意,作用域内的事务同步将始终由周围的事务驱动
以上是关于Spring事务隔离级别与传播行为的主要内容,如果未能解决你的问题,请参考以下文章