问题标签 [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.
php - PHP/MySQL/jQuery 悲观锁定记录
我一直在考虑为我参与的应用程序开发一些简单的记录锁定。有一些用户需要花费数小时才能完成对记录的编辑。当其他人想要更改记录时,这会导致问题。目前不涉及锁定。
我不确定乐观锁定在我的情况下是否可靠,因为记录是通过 AJAX 请求保存的。我正在考虑应用某种悲观锁定;使用两个字段,例如locking_user_id和locking_timestamp,我可以跟踪谁打开了记录以及上次打开它的时间。
但是,由于用户可能一次打开它几个小时,我怎么知道用户是放弃它还是只是在努力工作呢?我不想强迫他们每 5 分钟更新一次 ~ 但这可能是可能的(AJAX 每 5 分钟保存一次)。
也许一个 jQuery 进程可以在用户工作时计数,并且每 5 分钟触发一个 AJAX 请求 (getJSON) 以更新locking_timestamp。这样我就可以维护谁在记录中工作。在时间戳变“旧”之后,我可以假设用户不再使用 reocrd。有没有人有过这种锁定的经验?
azure - 在 Azure 缓存中处理悲观并发的最佳方法是什么?
我是天蓝色缓存的新手并面临一个问题。
我先简单介绍一下场景。我们正在SQL Azure
为我们的应用程序使用数据库。为了避免延迟问题和限制问题,我们使用 Azure 缓存(Web 角色上的共存缓存)。通过使用 Azure 缓存,我们只从数据库中获取数据一次并将其保存在缓存中以供进一步使用。
由于我们使用的是缓存数据,因此这里的挑战是在执行任何 DML 操作的任何时间点始终保持 SQL Azure DB 和 Azure 缓存之间的数据同步。我们通过首先更新数据库来做到这一点,如果更新成功则缓存数据无效。这种方法适用于正常情况。但是,随着并发用户工作和执行更新,似乎存在问题。我们在更新缓存中的数据时使用悲观并发模型。在这里,我们使用瞬态重试策略来确保重试尝试(假设 5 次,固定间隔为 1 秒)。
示例代码如下所示:
在这里,如果等待次数(比如说 6 次)超过重试次数(在我们的例子中是 5 次)。到第 6 次轮到它时,重试尝试已经结束,因此具有最新更新的第 6 次等待将无法在缓存中更新它。
有一种方法可以通过排队所有等待来克服这个问题,以防errorcode
在objectlocked
获取缓存键上的锁定时。
谁能建议处理这种情况的最佳方法?
c# - 使用悲观锁定向 Microsoft.ApplicationServer.Caching.DataCache 添加项目?
我正在服务器端的 Web 服务器上的缓存层上工作,使用 Azure 共享缓存来减少对数据库的请求量,从而使东西运行得更快(希望如此)。我遇到的问题是如何使整个 endevour 线程安全。我似乎没有找到一种可靠且可用的方法来锁定 DataCache 中的键。我缺少的是一种在密钥上存储任何内容之前预先锁定密钥的方法,这样我就可以添加一个值,而不会有另一个线程同时尝试做同样的事情的风险。
到目前为止,我一直只关注悲观锁定,因为这就是线程安全对我来说最有意义的方式,我想确保我正在处理的东西被锁定。
我明白,如果我要使用悲观锁定,我只负责使用与此相关的方法。混合使用会弄乱整个锁定机制(来源: http: //go4answers.webhost4life.com/Example/datacacheput-unlocking-key-77158.aspx)。
问题是,如果我尝试获取尚未在缓存中的内容,“GetAndLock”会引发异常。同时,我向缓存中添加内容的唯一方法是“PutAndUnlock”,除非我成功执行“GetAndUnlock”,否则无法使用该方法。
实际上,不可能向缓存中添加任何新内容,唯一可以做的就是替换已经存在的内容(这将一事无成)。
所以在我看来,在“GetAndLock”抛出异常的情况下,我被迫使用乐观的“Put”。但是,根据我所读到的内容,乐观的“Put”会破坏使用“GetAndLock”实现的任何现有锁,因此这将破坏线程安全的整个尝试。
基本上,这两个线程可以同时向同一个键写入不同的东西,而忽略它们都认为自己拥有的锁。
我唯一的结论可能是,DataCache 的悲观锁定是功能不完整,完全无法使用。我错过了什么吗?有没有办法解决这个问题?
我所缺少的只是一种在钥匙上存储任何东西之前抢先锁定钥匙的方法。
locking - 悲观锁定最坏情况
我们正在使用 Java EE。并且正在做一个应用程序,在最坏的情况下,大量的消息队列消息将来自同一个用户。
因此,我们正在寻找悲观的、SELECT FOR UPDATE 风格的锁定。这在理论上和第一次测试解决了我们的问题。
但我们害怕僵局。不是经典的:用户 X 锁定 A,用户 Y 锁定 B。但更多的场景如:系统崩溃,网络问题,......等等。数据库系统锁定,原因不明。我们将使用现代数据库,例如:oracle、MS SQL 和 postgresql。
我们想知道的是生产中使用的悲观锁定以及期望的实际问题?
提前致谢!
optimistic-concurrency - Lightswitch 2011 并发控制
我有两个问题。
- Lightswitch 2011是否也支持悲观并发控制?如果是这样,怎么做?
- 乐观控制是否支持来自外部数据源的表上的 ROWVERSION 列或仅使用行状态(使用原始值)?
感谢您的回复。
php - jQuery:当浏览器/计算机进入睡眠模式时,悲观的记录锁定?
我正在尝试使用一些处理悲观锁定的 PHP/MySQL/jQuery 代码来调试问题。它使用两个字段:locking_user_id 和locking_date_time。锁定由对 PHP/MySQL 的 AJAX 操作确定。下面的 jQuery 代码显示了每 15 秒发生一次锁定的典型更新。每 10 分钟还有一个保存动作。
我的问题是,当某人的计算机进入“睡眠模式”或“锁定”几个小时时,jQuery/锁定更新会发生什么?AJAX 调用会继续吗?我假设 setTimeout() 不再运行?一个人故意允许编辑视图一次保持打开数小时。我相当确定这是导致问题的原因。今天,我正在对更新进行额外的 PHP 验证检查。
有没有人有任何建议基于不活动使编辑视图“超时”?
相关文章: PHP/MySQL/jQuery 悲观锁定记录
java - 使用 Hibernate 和 HSQLDB 在数据库级别锁定实体
我有一个系统,我需要在并发上下文中创建 SomeEntity 的新实例,使用另一个实体作为“监视器”,如下所示:
当我使用 Mysql 时,这与使用 LockOptions.UPGRADE 加载监视器时发生的锁定完美配合,但是当我使用 HSQLDB 时,上面的代码不起作用,所有线程在数据库级别运行时都没有锁定,导致创建数据库中 SomeEntity 的许多实例。
主要问题
我需要使用 Hibernate 和 HSQLDB 在数据库级别锁定实体。
例子
为了举例说明我的需要,我创建了一个简单的项目,其中我有一个名为 Person 的实体类,它具有两个属性(id 和名称)和一个主程序,它将以并发方式更新单个实例的名称属性(Person#id = 1)。有 3 个线程竞争更新,所有将通过以下指令在数据库级别同步:
使用上面的代码一次只有一个线程将更新 name 属性,所有其他线程将等待获取锁。
如果发生锁,可以在 Hibernate 生成的 sql 代码中可视化,如下所示:
或者可以在 Eclipse IDE 的调试过程中可视化,在调用 session.load(...) 的行有一个断点(只有一个线程转到下一条指令,所有其他线程等待)。
所以,再次记住:这适用于 Mysql 但不适用于 HSQLDB。
附件
django - 开发 Django 中的 select_for_update
Django 文档指出:
如果您依靠“自动事务”在 select_for_update() 和后续写入操作之间提供锁定——这是一个极其脆弱的设计,但仍然可能——你必须将相关代码包装在 atomic() 中。
这不再起作用的原因是自动提交是在数据库层而不是应用程序层完成的吗?以前,事务将保持打开状态,直到调用数据更改函数:
Django 的默认行为是使用打开的事务运行,当调用任何内置的数据更改模型函数时,它会自动提交该事务
从 Django 1.6 开始,在数据库层使用 autcommit,aselect_for_update
后跟例如 awrite
实际上会在两个事务中运行?如果是这种情况,那么它并没有select_for_update
变得无用,因为它的重点是锁定行直到调用数据更改函数?
hibernate - 保存对象而不释放锁?
假设我有一个使用“lock:true”选择的域对象,或者之后简单地锁定。有没有办法在不释放锁的情况下将它的状态保存到数据库?(据我了解,默认行为是 save() 释放锁。)
我有一个长的(时间方面的)函数,其中包含许多操作,这些操作应该在整个执行过程中锁定对象,但是由于函数的某些部分可能会失败,我想在执行期间在某些点保存对象的状态。
hibernate - JPA 悲观锁尝试永远不会超时
我正在尝试通过 Hibernate 3 对 Postgres 数据库使用 JPA 中的悲观锁定。我无法让锁超时 - 它似乎永远挂起。
这是一个例子:
据我了解,em2 应该尝试最多五秒钟(5000 毫秒)来获取锁,然后应该抛出异常。相反,代码会陷入僵局。
如果我在两个不同的线程中运行它,那么我会看到 thread2(带有 em2)在 thread1(em1)释放它时立即获得锁。所以锁定正在发生,只是永远不会超时。
我使用 PESSIMISTIC_WRITE 和任何超时值(2ms、0ms 'NO WAIT')等都得到了相同的效果。
我正在使用 Hibernate 3.6.10 Final(最新的 Hibernate 3 版本)和 Postgres jdbc 驱动程序 9.2-1003.jdbc4(最新的驱动程序)。我正在针对 Postgres 8.4 数据库运行。
我发现的所有文档都表明这应该可行。有任何想法吗?
谢谢,阿拉斯泰尔