【问题标题】:What is the default isolation level across nested transactions (instead of concurrent ones)?嵌套事务(而不是并发事务)的默认隔离级别是多少?
【发布时间】:2019-04-24 14:14:01
【问题描述】:

Spring 有 3 种典型的嵌套事务传播:REQUIREDNEWNESTED。隔离级别类型总是根据并发事务来描述。但是嵌套案例呢?从内部到外部以及相反的默认可见性是什么?设置隔离级别对两者有何影响?

是否有任何经验法则,例如“外部事务总是看到内部不考虑隔离或传播类型的变化”或“内部只有在其设置为 read_uncommited 时才能看到外部的变化。还是根据需要设置等等..?

编辑:我说的不是实际的 sql 查询,而是持久性上下文。我的意思是,如果我创建一个资源并在嵌套事务模型的另一部分中读取它,无论它是否实际被持久化,我都会看到更改吗?一个很好的例子是一个事务工作流,它执行使用repository.save、repository.find ...等的事务方法

【问题讨论】:

  • 但这些都不是隔离级别。而是在某个特定点有/没有交易时该怎么做。我还要说,由于嵌套事务在“父”事务的范围内,因此它们共享共同的范围。从未测试过。
  • 我总是想到一个事务方法调用另一个事务方法。所以总是有事务的上下文。我希望即使默认情况下两个事务都已 read_commited,也会有更改可见性的特殊规则,但我在文档中找不到它
  • read committed 几乎在所有数据库中都是默认的,但例外情况较少,nested 传播类型不是很大,顺便说一句

标签: java spring spring-data-jpa spring-transactions jta


【解决方案1】:

内部和外部事务之间没有隔离。它存在的唯一原因是保存点。那个东西只是让你回滚内部事务而不回滚外部事务。 Documentation 说:

PROPAGATION_NESTED 使用单个物理事务和多个 它可以回滚到的保存点。 这样的部分回滚让 内部事务范围触发其范围的回滚,其中 外部交易能够继续物理交易 尽管已经回滚了一些操作。这个设置是 通常映射到 JDBC 保存点,因此它仅适用于 JDBC 资源交易。请参阅 Spring 的 DataSourceTransactionManager

统一更新: 你也可以find:

事务隔离级别。仅适用于传播设置 REQUIREDREQUIRES_NEW

【讨论】:

  • 我很欣赏这个答案,但我不确定是否完全专注于我所问的问题,即 Isolation.types 之外的隔离。也许编辑使它更清晰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-09-30
  • 2010-09-26
相关资源
最近更新 更多