问题标签 [pessimistic-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
14833 浏览

java - 如何从 Java 代码编写乐观和悲观锁定

我知道乐观锁和悲观锁是什么,但是当你写一个java代码时你是怎么做的呢?假设我在 Java 中使用 Oracle,我在 JDBC 中是否有任何方法可以帮助我做到这一点?我将如何配置这个东西?任何指针将不胜感激。

0 投票
1 回答
725 浏览

database - CakePHP 和悲观锁定:数据库与缓存

我在我的 CakePHP 应用程序中实现了一个悲观锁定,在不同的控制器之间共享。基本上,当一个页面被访问时,一条记录被写入一个表中,表明该模型的该条目正在由该用户编辑,并带有时间戳。每隔 30 秒,通过 ajax 调用,该记录的时间戳就会更新一次,表明该页面仍在使用中。如果有人试图进入该页面,访问将被拒绝。如果页面被留下,“锁”在这 30 秒结束时到期。

总的来说,查询是:

  • 3 加载页面时(清除所有超过 1 小时的锁 (DELETE),检查页面是否尚未使用 (SELECT),如果没有,则创建锁 (INSERT));
  • 2 当锁被更新时(检查页面是否已经被锁定(SELECT);如果不是,更新锁的时间戳(UPDATE));

我想知道我是否应该使用缓存系统,因为这不是数据的永久存储(显然应该使用数据库),而只是暂时的。它会比数据库更快吗?(但我不确定,因为我的缓存只是文件缓存)。

0 投票
3 回答
1773 浏览

sql-server - 在 SQL Server 2005 和 2008 中,如何判断我使用的是悲观并发模型还是乐观并发模型?

我知道 SQL Server 2000 有一个悲观的并发模型。而乐观模型是在SQL Server 2005 中添加的。那么我如何判断我是在使用悲观并发模型还是在SQL Server 2005 和2008 中使用乐观模型呢?

谢谢。

0 投票
1 回答
598 浏览

mysql - 通过显式排序避免死锁

我想明确提供有关 MySql InnoDB 应如何获取行锁的顺序。如果这是可能的,不应该有任何死锁只是停止。(如果我们遵循约定。)

首先,数据库应按升序锁定表“模型”中的所有行。然后第二个表“颜色”中的所有行都应该按升序锁定。有没有办法控制数据库先锁定表“模型”然后“颜色”?

举个例子:

0 投票
2 回答
1046 浏览

c# - 悲观锁定记录?

我正在为 Silverlight 应用程序创建一个 WCF Web 服务,并且我需要有一条记录在修改时被读/写锁定。

我正在使用 MySQL 5.5.11 版。

更具体地说,我想防止请求在修改时从 Row 读取数据。

UPDATE 和 SELECT 的两个 SQL 命令实际上非常简单,例如:

更新(应该锁定写/读):

选择(从上面的查询锁定时应该无法读取):

这是我尝试过的,但它似乎根本不起作用或锁定任何东西:

0 投票
1 回答
700 浏览

jakarta-ee - Java EE 6 - 悲观锁定 - 带有 UserTransaction、PreDestroy 和其他问题的 ViewScoped bean + Stateful bean

在我正在处理的应用程序中,我们需要在用户进入“编辑页面”之前启动事务(以锁定当前编辑的数据库记录)并在他单击按钮或离开页面时结束事务。

为此,我使用@Stateful管理事务的 EJB bean 和@ViewScoped在“编辑页面”上使用的 CDI bean。

当然,用户可以在编辑页面上执行许多操作,这些操作应该在同一个事务中调用。这是示例代码:

理论上它看起来不错,但我们有一些问题:

  1. 我们能否确定所有操作都在同一个事务中调用?
  2. 如果用户通过输入地址栏或 http 会话超时关闭选项卡/浏览器/转到另一个 URL 怎么办。我们如何检测它并回滚事务?起初我们尝试过,@PreDestroy但看起来它从未被调用过!

我们使用 Java EE 6 技术:JSF、EJB。在 Glassfish 3.1.2 Web 配置文件上部署。我们使用 MyBatis 代替 JPA。感谢帮助

0 投票
0 回答
264 浏览

synchronization - 分布式多资源悲观锁定算法

我正在为分布式键值存储实现悲观锁定。我有一个坚如磐石的原子比较交换(以及递增和递减)操作来实现锁。还有已经提供原子操作的集合、排序集合、列表和数组的数据结构(我可以使用服务器端脚本以任何方式原子地操作这些结构)。

使用上述作为构建块,我需要制作一个支持像.Net's WaitHandle.WaitAll这样的操作的可重入互斥锁,即。能够在一次调用中锁定多个资源,同时最大限度地减少活锁和饥饿的可能性。我怎么做?有普遍接受的算法吗?

作为一个附带问题,我已经研究了诸如彼得森算法及其亲属之类的东西,但似乎这些互斥算法正在解决与我所面临的问题不同的问题(我已经有了原子操作)。我正在努力做一些我认为被认为是更高级的同步原语的东西(基于http://en.wikipedia.org/wiki/Mutual_exclusion#Advanced_mutual_exclusion的标题),我想知道是否有单独的一类算法这回答了这些不那么深入的核心问题。

0 投票
1 回答
179 浏览

sql - 用于编辑具有多个用户的多级节点层次结构的体系结构

我正在构建一个模块来编辑节点的层次结构。您可以将其视为一个非常大的目录结构,其中包含许多级别的嵌套目录和文件。层次结构的节点存储在关系数据库表中。唯一的区别是没有文件夹/目录之类的东西。所有节点都具有相同的特征。所以一个节点有一个父节点,它也是一个节点。而且只有一个根节点,一个节点只能有一个父节点,所以没有多层次结构。

表列:

node_id [bigint] 非空
名称 [nvarchar(50)]
parent_node_id [bigint]
叶节点 [bit]

目标是找出一种方法来编辑一个层次结构,而无需用户互相踩脚。我们要么必须设计版本控制架构来解决冲突,要么使用某种锁定机制(悲观或乐观)来防止其他人编辑作为整个层次结构中某个给定父节点的祖先(或子树)的一部分的节点树。如果我们执行锁,那么每个使用编辑器的人都需要不断刷新他们的树才能看到其他人的变化。

只有三个功能需要担心。只有一个用户允许在主树中编辑节点/对象。将新创建的子树拖放到主树中。将主树中的子树拖放到主树中的另一个节点中,从而使删除的子树成为该节点的子节点。

我认为这种架构与管理文件夹和文件的操作系统架构没有什么不同。这通常是如何在成千上万的用户上完成的?我宁愿使用锁定机制而不是使用版本控制来降低复杂性。我只是不确定最好的方法是什么。

到目前为止,这是我的计划:

  • 如果一个节点正在被编辑,在保存发生并且数据库即将更新记录之前不要锁定它。数据库进行更改后,将其解锁。如果其他人试图在数据库进行更改的同时编辑记录,请不要告诉用户它已被锁定。让数据库处理记录/节点上的锁。

  • 如果新的子树被拖入主树的父节点,则锁定新的父节点。然后插入新记录并更新根父节点以指向主树父节点。然后通知所有客户端更新他们的主树。因此,在删除发生后,所有锁定都发生在数据库端。

  • 如果一个现有的主树父节点被拖到一个现有的主树父节点中,并成为一个子节点,那么我们应该锁定旧的父节点(成为新的子节点)并锁定新的父节点。然后更新新子节点的父节点。然后更新所有客户端(所有用户)并更新他们的主树。因此,在删除发生后,所有锁定都发生在数据库端。

0 投票
2 回答
11859 浏览

java - 如何在 Oracle 中回滚/超时“选择更新”锁?

我们的应用程序主要使用 Hibernate 的版本控制支持的乐观锁定。我们计划在一种特定情况下实施悲观锁定。我对悲观锁定没有太多经验,所以如果这个问题听起来很幼稚,请原谅。

当用户表现出更新条目的意图时 - 我们使用“选择更新”锁定相应的数据库行。现在,如果这个用户需要很长时间来提交他的更改在锁定后忘记了它,我们如何使用一些超时/回滚机制来解锁这个锁?这样该行就不会长时间保持锁定状态,并且不允许所有其他用户对其进行编辑。

我怀疑这是否会在我们正在使用的 Weblogic-JTA-Spring 事务机制中处理——我们已经有 30 分钟的事务超时。(??)

因此,是否应该直接在 Oracle 级别处理此回滚。如果是,那么如何?请就处理此问题的最佳方法提出建议,以免此类锁停留太久。

0 投票
2 回答
2301 浏览

hibernate - JPA 合并()最佳实践

我为它实现了一个服务entity object,它使用了 pure jpa,我使用了spring,所以spring xml config配置hibernate为一个jpaimpl。我正在使用spring数据进行crud操作。但是在我们的系统中,我们的entity对象被多次拉取/更新concurrency,并且数据存在高竞争()。从我们在许多地方的代码中,很多classes只是inject服务 bean 和调用getEntity方法来获取一个实体,之后他们更改实体(据我的理解,这是分离的,但在同一个线程中,所以 em 对象应该与我的知识相同)所以实体需要一段时间才能回到服务进行更新,他们调用save()服务的方法来保存实体。Save()方法只不过是调用merge()粗加工操作。它是带有@Transactional注释的事务性的。这里出现了一个问题,当有人拉动一个实体对象并且在更改它时其他人可能会拉动并更改它并将其保存回来,所以我的实体读取是脏的,如果保存它,我将覆盖已经更新的实体。问题是我们正在改变服务之外的实体并调用保存。这里 spring 数据存储库类是 DAO 层。

Optimistic lock是一种解决方案,但由于某些原因我们不喜欢它,所以它对我们不起作用。我在想pessimistic lock。例如,当我通过锁定获取要更新的实体时,然后在不同位置的其他地方更改它并回调(entity已经锁定更新!)它是否有效?我不确定它是否仍然EntityManager反对我用来拉实体的地方。如果它在那里,则需要很长时间才能通过这些“智能”逻辑,然后才能对其进行更新和解锁。

这是该场景的简单示例代码:

在这里,我不能tons of logic在服务层中移动它,它非常具体,这种不同的逻辑存在于数百个地方。

那么有什么办法可以解决并至少对这种情况应用悲观锁定?