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

与数据库事务的悲观锁定关系

满昊然
2023-03-14

我知道悲观锁定与锁定数据库记录,并在获得锁的“交易”结束时释放它。但这是否意味着悲观锁定是在物理交易中,例如

开始交易

//pessimistic locking

提交事务?

对于一个网页,当用户选择要编辑的记录时,当他按下编辑按钮时,我想悲观地锁定此记录,以便其他人无法更改它,然后在编辑按钮onpress()事件中,我开始物理事务?

似乎是不可能的,因为编辑过程可能很长......它在整个编辑过程中保持数据库事务(按编辑按钮,在网页中编辑,按保存按钮)悲观锁定?

共有2个答案

常温文
2023-03-14

实际上,对于这种情况,应该使用乐观锁定。它可以按以下方式使用:

  1. 用户从UI请求获取要编辑的记录。
  2. 服务器选择记录并将它们传递给UI。假设此时要编辑的记录具有版本1。现在数据库连接被释放。没有数据库资源被持有,因为我们不知道用户是否会发出更新请求。
  3. 现在用户在UI上编辑数据,并使用在步骤2中发送的原始版本号向服务器请求更新数据。
  4. 现在从db连接池中获取一个新的数据库连接,如果db中的原始记录与步骤2中发送到UI的版本相同,则在db中更新记录。在使用发送编辑请求之前,步骤4中存在的记录的版本已更改,您应该要求用户使用新数据再次编辑。

在上述场景中,在用户的整个会话期间,没有数据库资源被保留。一般来说,在这种情况下,乐观锁定是好的。

但是如果在事务提交之前用写锁持有资源非常重要,那么应该使用Pessimitic

例如,假设一个简单的电影票预订系统,它不为尚未付款的用户保留种子。意味着付款后他们可能会或可能不会拿到票。付款后,他们需要预订引擎来预订机票。

  1. 假设数据库中有一个表,它保存了一个节目中剩余的座位数。
  2. Tx1对此表采取悲观的写锁。
  3. 在预订电影的事务TX1提交之前,任何其他事务都不能锁定此表
  4. 当Tx1完成时,它会将座位数减少Tx1中预订的座位数
  5. 现在,当Tx2获得写入锁定,并且如果剩余的座位数是兼容的,它将继续,如果不兼容,它将向用户显示一条消息,表明其他用户预订了座位,并且退款

在这种情况下,保持悲观锁直到预订事务完成是有意义的。即使在这种情况下,在用户完全同意的情况下,也没有锁和事务被持有。

悲观读锁或悲观写锁被保留,直到事务被提交或回滚。只有悲观读锁可以共享所有其他组合相互阻止,直到释放。

卢英叡
2023-03-14

构建这样的锁定系统不是很实用。即使您能够以某种方式执行此操作,也会严重限制允许访问服务器的用户数量。

如果允许许多用户编辑一个用户提交的帖子,则应使用某种版本控制系统。或者,如果您更喜欢锁定系统,那么创建一个系统来保留帐户谁在编辑以及编辑什么,并定期从客户端更新此信息。就像每分钟一次,如果服务器在两分钟内没有听到来自客户端的任何声音,则释放锁。

 类似资料:
  • 我正在编写一个Web应用程序,其中两个不同的用户可以更新一个事物列表,例如待办事项列表。我开始意识到,乐观锁定机制效果最好,因为我不期望高争用。 我正在查看事务隔离级别,现在我有点困惑。看起来不同的事务隔离级别也解决了类似的问题。 这两个不同的概念是如何相互关联的?如果可能,举一个简单的例子。

  • 我遵循grails文档,它说要做悲观锁定,我可以这样做: 所以这会锁定计划实例,直到保存完成。现在在我的例子中,我想一次锁定多个计划,如下所示: 我在默认情况下是事务性的 grails 服务中执行此操作,但上述行没有按预期工作。它不会锁定所有行,并在执行并发事务时引发。 如何在阅读时锁定多行? 有关更多信息,请参见相关问题:grails中的并发事务导致数据库陈旧状态异常

  • 我在一个游戏服务器上使用Hibernate for ORM,刚刚从每个工作单元的会话/事务切换到每个请求的会话/事务。 由于多个事务可能相互冲突,因此我使用悲观锁定。问题是我经常遇到僵局。现在我的问题是,是否可以在锁定特定实体实例的事务中显式定义范围,或者在指定锁定模式后是否锁定实例直到我提交事务? 如果后者成立,如果我不能任意调度锁定数据库中资源的方法的方法调用,我如何避免每个请求环境中的会话事

  • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

  • 本文向大家介绍请你介绍一下,数据库乐观锁和悲观锁相关面试题,主要包含被问及请你介绍一下,数据库乐观锁和悲观锁时的应答技巧和注意事项,需要的朋友参考一下 考察点:数据库   悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。悲观锁:假定会发生并发冲突,屏蔽一切可

  • 我上面代码的日志是: 数据库也会更新。为什么lock()不工作?不是在lock()之后其他实例无法更新吗?还是别的什么?还是我错过了什么?