gpt4 book ai didi

sql - 释放 SELECT... FOR UPDATE 锁

转载 作者:行者123 更新时间:2023-12-04 14:24:39 26 4
gpt4 key购买 nike

我的问题很简单:SELECT ID FROM TABLE FOR UPDATE NOWAIT的反向SQL语句是什么? ?如何在提交之前获取锁的同一事务期间释放锁?

扩展:我正在编写利用 Hibernate 将行级锁应用于实体的可移植 API 代码。以下 API 可供实现者使用

@Override
public void lock(T object)
{
try
{
getHibernateTemplate().lock(object, LockMode.UPGRADE_NOWAIT);
}
catch (Throwable e)
{
log.error(e.getMessage(), e);
throw e;
}
}

@Override
public void unlock(T object)
{
try
{
getHibernateTemplate().lock(object, LockMode.NONE);
}
catch (Throwable e)
{
log.error(e.getMessage(), e);
throw e;
}
}

我在交易中使用锁码。 Lock 方法很有魅力,我在我期望的地方得到了预期的并发异常!我看到在您从持久层获取实体后,Hibernate 执行上面显示的 SQL 查询来锁定对象。我写了 unlock方法作为自然对偶到 lock方法。

除了提交/回滚事务之外,是否可以自愿释放对象上持有的锁?或至 降级它 ?

我用谷歌搜索过,但都找不到 SELECT FOR UPDATE 的反向 SQL 语句是什么也不是 Hibernate 在降级锁时会做什么。我怀疑释放锁在主要 SQL 数据库中实际上是不可能的,所以 unlock() API 不应被任何调用代码使用。我负责的项目不需要在事务期间主动释放锁(他们会在最坏的情况下提交只读事务),但我质疑自己 unlock 的用处应用程序接口(interface)。

我自愿省略了我的应用程序运行的数据库,因为这是 MS Sql、MySql、Postgres 和 Oracle 的可移植 API 代码

最佳答案

在大多数数据库中 - 不可能在没有 COMMIT 或 ROLLBACK 的情况下释放锁。

据我所知,当您 SELECT FOR UPDATE 时,数据库(在幕后)将此视为作为事务一部分发生的更新。因此,就像任何其他更新一样,锁定仅在 COMMIT 或 ROLLBACK 时释放。想象一个场景,获取锁的同一个事务也更新了记录。在这种情况下,它变得过于复杂,无法支持显式解锁并检查事务在锁定时是否确实对记录执行了任何其他操作。不同的隔离级别会进一步增加复杂性。

关于sql - 释放 SELECT... FOR UPDATE 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48318462/

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