作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题很简单: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;
}
}
unlock
方法作为自然对偶到
lock
方法。
SELECT FOR UPDATE
的反向 SQL 语句是什么也不是 Hibernate 在降级锁时会做什么。我怀疑释放锁在主要 SQL 数据库中实际上是不可能的,所以
unlock()
API 不应被任何调用代码使用。我负责的项目不需要在事务期间主动释放锁(他们会在最坏的情况下提交只读事务),但我质疑自己
unlock
的用处应用程序接口(interface)。
最佳答案
在大多数数据库中 - 不可能在没有 COMMIT 或 ROLLBACK 的情况下释放锁。
据我所知,当您 SELECT FOR UPDATE 时,数据库(在幕后)将此视为作为事务一部分发生的更新。因此,就像任何其他更新一样,锁定仅在 COMMIT 或 ROLLBACK 时释放。想象一个场景,获取锁的同一个事务也更新了记录。在这种情况下,它变得过于复杂,无法支持显式解锁并检查事务在锁定时是否确实对记录执行了任何其他操作。不同的隔离级别会进一步增加复杂性。
关于sql - 释放 SELECT... FOR UPDATE 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48318462/
我是一名优秀的程序员,十分优秀!