问题标签 [optimistic-concurrency]
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.
c# - 为什么在 Albahari 的“C# 中的线程”中的 LockFreeUpdate 示例中需要 SpinWait
我正在Ref<T>
使用无锁乐观更新方法进行小型抽象(应该使用不可变T
数据结构,特别是不可变树)。它基于SpinWait 使用LockFreeUpdate
部分中 Albahari 的“C#中的线程”方法:
我的问题是为什么我们在这里需要 SpinWait? 因为如果字段已经更新,那么另一个并发代码可以立即从新值重试更新。
下面提供了没有 SpinWait 的完整 Ref 代码(检查Update
方法以进行比较):
azure - Azure 表存储并发问题
似乎与 Azure 的并发冲突会引发异常,并带有包含错误代码 412 的消息。除了检查 StorageException 的错误消息是否包含 412信息?这似乎是一种真正的字符串类型方法。
meteor - Meteor 中使用的并发控制技术是什么
我对 Meteor 很陌生,但我觉得它很有趣。
我只是想知道 Meteor 用于实时进行并发控制的底层技术或算法是什么,以及它如何处理冲突?它是基于运营转型 (OT) 还是其他?此外,了解 Meteor 的架构也会有所帮助。
python - 使用 GET 和 INCR 对 redis 进行乐观锁定
我想乐观地“锁定”一段代码。伪代码如下:
这对我来说很好,因为 INCR 和 GET 都是原子的。你觉得这种方法有什么问题吗?
java - 检测方法的并发调用
我有一个类序列化器:
目的是确保实际一次从单个线程运行。但是,在持有锁的同时调用回调通常是危险的,因此调用者不是持有锁,而是将传入的值排队,其中一个线程将进入,排空队列并依次循环调用实际的使用者。(另一个限制是并发调用者的数量是未知的。)
这是可行的,并且解决了无界队列、线程跳跃和线程卡在循环中的问题,但与直接方法调用相比,基准测试在单线程情况下提供了 10% 的吞吐量。当 I. 使用同步块实现此排队/发射时,基准测试提供了 50% 的直接情况,因为 JVM 优化了同步;这会很棒,但它也不能扩展。使用 juc.Lock 可以扩展,但会遭受与上述代码类似的单线程吞吐量下降。如果我没记错的话,一旦 JVM 优化同步了,它仍然必须使用一些保护,以防该方法再次被并发调用并放回锁定。
我的问题是,如何使用锁、队列或其他序列化逻辑来实现类似的效果,即,在没有并发调用的情况下有一条便宜且快速的路径,并为并发情况提供另一条路径,所以代码可以扩展并且对于单线程使用也保持快速。
c# - 通过 ajax 或其他机制通知用户对数据的更改
我需要尝试通知正在修改同一页面的用户对 Excel 网格 SPA 进行了更新。我正在考虑通过包来传递修改日期的时间戳,如果原始时间戳是数据库中当前的过去,则意味着网格已被其他人更新。有一个更好的方法吗?
concurrency - SignalR 和一次用于会话的一个浏览器窗口
我有一种情况,用户可以在线修改 Excel 等网格计划。我希望能够显示一条消息,说明计划正在另一个窗口中进行修改。但是,如何在打开窗口的情况下执行此操作,并且如果先前的窗口已使用 SignalR 关闭。对于其他会话,我只想说明另一个用户正在修改时间表。
java - 乐观锁定和覆盖
在尝试了解基于版本的乐观锁定如何防止“最后提交获胜”问题和适当的覆盖时,我遇到了困难。
为了使问题更具体,让我们考虑以下使用 JDBC 的伪代码:
在这里,如果其他事务会在更新和提交之间提交其更改怎么办?如果事务是并发的,则第一个事务所做的更新尚未提交,因此对第二个事务不可见(具有适当的隔离级别),因此第一个事务提交将覆盖第二个事务的更改,而无需任何通知或错误。
乐观锁定是否只是降低了问题的可能性,而不是一般地阻止它?
php - Doctrine2 中的乐观锁不适用于多对多关系
我有User
与角色有多对多关系的实体。我试图实现乐观锁,一切正常,只是当我改变角色时,它不会改变版本(用户实体版本),这是正确的行为吗?
ravendb - 在多个客户端上实现具有乐观并发检查的事件存储
我正在尝试使用与我所看到的各种 Greg Young 启发示例一致的实践和原则来实施事件溯源系统。
我了解版本检查逻辑是如何工作的,并且在保存聚合时,如果当前版本与预期版本不匹配,则意味着另一个会话/客户端应用程序在您之前更新了聚合。
我也明白,当并发事件被保存时,您可以采用一种追溯解决冲突的方法,这个问题与这样做无关。
我想了解的是,在使用诸如 ravendb 之类的 nosql 数据库作为事件存储的特定实现中,我将如何确保写入的事件不会由于竞争条件而与版本号重叠。
以下代码来自一个示例项目来说明:
在Repository<TAggregate>
存储库类中有一个保存方法
现在,当只有一个应用程序时,这基本上可以正常工作。当当前线程获取锁,检查版本,然后写入自己的事件时,锁会停止任何其他线程向事件存储写入事件。
然而,想象两个独立的客户端在不同的机器上运行。显然,这两个进程都可以一起进入锁,然后它们都可以执行该GetById()
方法并且都看到相同的当前提交的版本。然后,两个进程将继续写入具有递增版本号的未提交事件。但是,这会使聚合的事件流处于可能存在具有相同版本号的不同事件的状态。
我知道我可以做一些回顾性的决议,但这不是我想要完成的。
现在很明显,这意味着需要在事件存储数据库方面进行某种锁定。谁能建议如何做到这一点?答案不必是特定于数据库的,但 ravendb 示例会很棒,因为这就是我计划用它来原型化我的事件源系统。