gpt4 book ai didi

java - Hibernate 中如何获取共享锁和独占锁

转载 作者:行者123 更新时间:2023-11-30 06:23:53 24 4
gpt4 key购买 nike

我尝试了解 READ COMMITED 和 READ UNCOMMITED 隔离级别在 Hibernate 中的工作方式,需要一些解释。

有 2 个线程 THR1THR2 都执行相同的事务方法(Spring Transactional 注释,隔离级别设置为 READ COMMITED)。相应地为这些线程 TRA1TRA2 创建的事务命名。交易方法如下:

public void updateOrSavePreference(String name, String value) {
Preference preferenceToUpdate = findPreferenceUsingNamedQuery(name); // line 1. shared read lock acquired (uses HibernateTemplate.findByNamedQueryAndNamedParam(...))
if (preferenceToUpdate != null) { // line 2.
preferenceToUpdate.setValue(value); // line 3. exclusive write lock acquired (actually I use the HibernateTemplate.merge(...) method
// instead a setter because the entity type is immutable, but it seems irrelevant for this example)
} else { // line 4.
HibernateTemplate.save(preferenceToUpdate); // line 5. exclusive write lock acquired
}
}

Preference 类注释为 Entity (optimisticLock = OptimisticLockType.NONE ) 为该实体强制执行 2PL 模型(我错了吗?)。我使用Oracle数据库。

考虑以下场景:

  1. 假设线程 THR1 进入第 1 行并查询一个对象。如果我理解正确的话,该线程创建的事务 TRA1 获取查询条目的共享读锁。然后,如果 THR2 线程进入第 3 行尝试获取该实体的独占写锁,那么在 TRA1 释放读锁之前,THR2 不应该被阻塞吗?

  2. 假设线程 THR1 进入第 3 行并获取实体的独占写锁(独占锁一直保持到 TRA1 transaction completes )。然后,THR2 线程进入第 1 行并尝试查询该实体。难道 THR2 不应该被阻止,因为 TRA2 事务试图获取读锁,而其他事务 TRA1 持有该实体的独占写锁吗?

  3. 如果我针对 READ UNCOMMITED 隔离级别重现第 2 点的场景,执行 TRA2 事务的 THR2 不会看到 THR1 在 TRA1 事务中所做的更改,即使在 refreshing 之后也是如此。或再次查询实体(调试下的“评估表达式”)。为什么?

最佳答案

技术上读已提交可以通过设置读锁来实现。但不一定。如果您的 DBMS 支持 MVCC,您始终会读取已提交的数据(除了您自己的事务中更改的数据),而无需设置锁。

所以我怀疑你使用 oracle、mysql (INNODB) 或 postgres 进行测试?所有这些 DBMS 默认都支持 MVCC,因此它们从不设置共享读锁。

由于您使用的是 Oracle“MVCC”数据库,因此即使您在实体中进行配置,也不会实现 2PL 协议(protocol)。如果您想了解 DBMS 中 native 语句的实际执行情况,只需激活 native 语句的输出,就像在 persistence.xml 中所做的那样:

<property name="hibernate.show_sql" value="true" />

也许您还应该看看transaction-isolation-levels-relation-with-locks-on-table或首先访问:locks and oracle

关于java - Hibernate 中如何获取共享锁和独占锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613569/

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