当前位置: 首页 > 知识库问答 >
问题:

在提交事务之前,Hibernate如何进行行版本检查以进行乐观锁定

拓拔松
2023-03-14

在提交当前事务之前,当hibernate检查行的版本时,它应该发出一个sqlselect语句来获取ithe行。

假设发出select语句后,hibernate发现行版本没有更改,因此它应该继续提交事务。

否则,在行版本检查和提交之间会有一个很短的时间间隔,这可能会发生竞争条件。

请分享你的想法。

共有1个答案

晋坚
2023-03-14

对于默认的乐观锁定机制,即@version注释给出的机制,不存在这样的风险。

乐观锁定不需要任何额外的选择来获取和检查实体修改后的版本。因此,涉及两个步骤:

>

  • 从DB中提取实体及其版本:

     SELECT * FROM PRODUCT WHERE ID = 1;
    
     UPDATE PRODUCT SET (LIKES, QUANTITY, VERSION) = (5, 10, 3) 
     WHERE ID = 1 AND VERSION = 2;
    

    只有显式的lockmodetype.optimative才能导致竞争条件。但是,您可以使用悲观的共享锁或显式锁轻松地修复此问题。

  •  类似资料:
    • 问题内容: 我对Hibernate和Spring完全陌生,在尝试学习Spring,Hibernate,Maven等时,我只知道如何使用这三个方法来运行helloworld示例。根据我的基本理解,我被分配了执行乐观锁定的任务。就我用谷歌搜索,我只能看到它不是很困难,我所需要的只是在我的xml中添加一个版本标签,并在我的映射类中添加整数变量版本。 我的xml应该是这样的 当第二个用户保存时,hiber

    • 我想为关系数据库实现乐观锁定。 假设有一个表 我的应用程序获取< code>Jhon用户来更改他的名字 那么,我需要在哪里将所选行的版本与数据库中的行的版本进行比较呢? 数据库事务是否是获取行的现有版本并将其与已获取的记录进行比较的好地方?

    • 问题内容: 使用版本属性对实体进行乐观锁定可以很好地实现,并且易于实现: 实体具有以下类型的属性: 到目前为止,一切都很好。现在,服务方法返回上述实体的数据传输对象(DTO),视图以HTML形式显示。对于更新页面,VERSION属性存储在HTML隐藏字段中,并与表单一起提交。 目的是使用version属性来确保如果显示的信息带有旧版本,则用户的更新将失败。 控制器通过调用包含更新信息(包括版本属性

    • 问题内容: 这应该很简单,但是却让我发疯。我有一个用ajax提交的html5表单。如果输入的值无效,则会弹出一个提示您的信息。在运行ajax提交之前,如何检查条目是否有效? 形成: 提交: 问题答案: 默认情况下,jQuery对HTML5验证一无所知,因此您必须执行以下操作:

    • 我有一个这样的实体: 我有一个生成HQL的代码: 执行更新的代码: 问题: 乐观锁在这里出现吗?在上述情况下,Hibernate是否会自动处理乐观锁定(运行HQL且没有会话)? 如果上述情况不正确,我需要自己实现:我阅读了Hibernate文档,其中说,我需要用注释一个字段。但是我应该专门为此在表中添加这个新字段吗?或者我可以为注释指定任何现有字段?这里有什么特殊处理吗? 在乐观锁定期间抛出的异常

    • 我刚刚发现,当我对Postgresql或MariaDB数据库使用乐观锁定时,我的应用程序表现不同,我想知道是否有人可以解释发生了什么,以及我如何才能使应用程序以相同的方式使用MariaDB?我使用Postgresl 10.5和MariaDB 10.3.10,带有InnoDB引擎和默认设置。我用的是Spring框架5.1.0版,Hibernate 5.3.6。 所以我的代码看起来像这样: 我还有一个