Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 发布一个选择。。。用于更新锁_Sql_Hibernate - Fatal编程技术网

Sql 发布一个选择。。。用于更新锁

Sql 发布一个选择。。。用于更新锁,sql,hibernate,Sql,Hibernate,我的问题很简单:selectid fromtableforupdatenowait的反向SQL语句是什么?如何在提交前获得锁的同一事务中释放锁 扩展:我正在编写利用Hibernate将行级锁应用于实体的可移植API代码。以下API可供实现者使用 @Override public void lock(T object) { try { getHibernateTemplate().lock(object, LockMode.UPGRADE_NOWAIT);

我的问题很简单:
selectid fromtableforupdatenowait
的反向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
方法的自然对偶

除了提交/回滚事务外,是否可以自动释放对象上的锁?或者将其降级

我在谷歌上搜索过,但既找不到
selectforupdate
的反向SQL语句是什么,也找不到Hibernate在降级锁时做了什么。我怀疑在主要的SQL数据库中释放锁实际上是不可能的,因此任何调用代码都不应该使用
unlock()
API。我负责的项目不需要在事务期间自愿释放锁(在最坏的情况下,它们将提交只读事务),但我怀疑
unlock
API的有用性


我很乐意省略我的应用程序运行在哪个数据库上,因为这是大多数DBs中MS Sql、MySql、Postgres和Oracle的可移植API代码-不提交或回滚就无法释放锁


据我所知,当您选择更新时,DB(隐藏)将其视为作为事务一部分发生的更新。因此,与任何其他更新一样,锁仅在提交或回滚时释放。想象一个场景,获取锁的同一事务也对记录进行了更新。在这种情况下,它变得太复杂,无法支持显式解锁并检查事务在锁定时是否对记录执行了其他操作。不同的隔离级别将进一步增加复杂性。

MySQL 8.0支持选择更新NOWAIT |跳过锁定


请参阅此处:

我不知道有任何数据库会在请求锁的事务完成(提交或回滚)之前释放行锁。请仔细阅读社区标准,了解如何回答、编辑和解释您的答案,因为答案似乎不明确,只是粘贴链接没有帮助