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

执行乐观锁定时,在何处/何时检查行的版本?[副本]

倪阳飇
2023-03-14

我想为关系数据库实现乐观锁定。

假设有一个用户

我的应用程序获取< code>Jhon用户来更改他的名字

SELECT id, name, version FROM users WHERE id = 1;
jhon = get_user_by_id('1');

jhon.change_name_to('Jhin');

jhon.save() // this method should fail or succeed depending on the version of the row in the database

那么,我需要在哪里将所选行的版本与数据库中的行的版本进行比较呢?

数据库事务是否是获取行的现有版本并将其与已获取的记录进行比较的好地方?

transaction_begin()

jhon = get_user_by_id('1')

if (jhon.version !== updated_jhon.version) { // Ensures that version match
  // If no rollback
  transaction_rollback();
} else {
  // If yes, update and commit
  query("UPDATE table SET name = {updated_jhon.name}, SET version = {jhon.version + 1} WHERE id = 1;")
}

transaction_commit()

共有1个答案

宗政才俊
2023-03-14

我在一个类似的问题中找到了答案

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

答案是根本不阅读版本。

乐观锁定不需要任何额外的SELECT来获取和检查实体修改后的版本

为了更新记录(用户),我们还需要传递一个版本

UPDATE users SET name = Jhin WHERE id = 1 AND VERSION = 1;

如果受影响的记录数大于 0,则表示该行在名称更新期间不受其他人的影响。

如果受影响的记录数等于0。这意味着在我们的修改过程中,其他人已经更改了该行。

 类似资料:
  • 在提交当前事务之前,当hibernate检查行的版本时,它应该发出一个sql语句来获取ithe行。 假设发出语句后,hibernate发现行版本没有更改,因此它应该继续提交事务。 否则,在行版本检查和提交之间会有一个很短的时间间隔,这可能会发生竞争条件。 请分享你的想法。

  • 我的一个项目需要Java1.8,但有时我们没有注意到我们使用的是较旧的Java,所以我们会得到一些奇怪的错误。 我想在中添加检查功能,这样当我们运行任何任务时,它都会首先检查版本,并立即打印错误和退出。 我尝试在第一行的中直接添加检查,但它仍然在检查发生之前执行一些其他任务,例如(、),当我运行: 如何正确地去做?

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

  • 存储这些数据后,当需要更新数据时,首先将JSON字符串解析为实体,然后更新属性,然后在Redis中刷新数据。所以Redis中的数据将是最新的数据。 当我们需要将Redis数据保存到MongoDB时,我们首先将JSON字符串解析为实体,然后使用Morphia DAO保存实体,但是我们遇到了这个异常: 我知道这一定是乐观锁的问题。我们如何解决这个并发异常?

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

  • 我正在调试使用JPA / Hibernate和Postgres(9.6.2)的Java应用程序的奇怪行为。 应用程序有 3 个实体:用户、国家/地区、用户事件。 Hibernate将其映射到4个表:users、countries、userevent、Hibernate_sequences。 用户实体具有版本列 (@Version) 和用于乐观锁定的主题。@GeneratedValue(strate