gpt4 book ai didi

java - Spring 事务隔离级别

转载 作者:可可西里 更新时间:2023-11-01 07:58:36 25 4
gpt4 key购买 nike

我们大多数人可能都在使用 Spring 和 Hibernate 进行数据访问。我试图了解 Spring Transaction Manager 的一些内部结构。

根据Spring API,它支持不同的隔离级别- doc但是我找不到明确的信息说明这些在哪些情况下真正有助于提高性能。

我知道 Spring Transaction 中的 readOnly 参数可以帮助我们使用不同的 TxManager 来读取只读数据,并且可以利用良好的性能。但它锁定 表以获取数据以避免脏读/未提交读 - doc .

假设,在少数情况下,我们可能想盲目地将记录插入表中并在不锁定表的情况下检索信息,这种情况我们从不更新表数据,我们只是插入和读取[append-only]。我们可以使用更好的隔离来获得任何性能吗?

  1. 正如您从其中一个引用链接中看到的那样,我们真的需要实现/编写我们自己的 CustomJPADiaelect 吗?
  2. 哪种隔离更符合我的要求?

最佳答案

Read-only 允许某些优化,例如禁用脏检查,当您不打算更改实体时,您应该完全使用它。

每个isolation level定义数据库必须施加多少锁定以确保数据异常预防。

大多数数据库使用MVCC (Oracle、PostgreSQL、MySQL)所以读者不会锁定作者并且作者不会锁定读者。正如您在 the following example 中所见,只有作者锁定作者 .

REPEATABLE_READ 不必持有 来防止并发事务修改当前事务加载的行。 MVCC 引擎允许其他事务读取行的已提交状态,即使您当前的事务已更改它但尚未提交(MVCC 使用撤消日志来恢复以前版本的未决更改 行)。

在您的用例中,您应该使用 READ_COMMITTED,因为它比其他更严格的隔离级别更好地扩展,您应该使用 optimistic locking以防止在长时间对话中丢失更新。


更新

@Transactional(isolation = Isolation.SERIALIZABLE) 设置为 Spring bean 具有不同的行为,具体取决于当前事务类型:

  • 对于 RESOURCE_LOCAL 事务,JpaTransactionManager 可以为当前运行的事务应用特定的隔离级别。
  • 对于 JTA 资源,事务范围的隔离级别不会传播到底层数据库连接,因为这是默认的 JTA 事务管理器行为。您可以按照 WebLogicJtaTransactionManager 的示例覆盖它。

关于java - Spring 事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com