问题标签 [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.

0 投票
2 回答
833 浏览

nhibernate - 是否有替代 ISession.Merge() 在使用乐观锁定时不会抛出的替代方法?

我一直在尝试使用 ISession.Merge() 来保持两个会话之间的一致性,但是当合并的实例具有比会话中加载的版本更高的版本属性时(带有 StaleObjectStateException),它会失败。

当版本字段不匹配时,是否有替代方法可以使用?

0 投票
1 回答
940 浏览

hibernate - Hibernate:我是否应该在 hashcode() 和 equals() 方法中包含“版本”字段

我知道在覆盖我的持久实体时hashcode()equals()我不应该包含 ID,而只包含唯一标识对象的有意义的属性。但是Hibernateversion用于乐观并发控制的字段呢?我是否也应该跳过它,就像 ID 一样?如果让我们说new User(name='John', version=1).equals(new User(name='John',version=2)),无论如何它不会混淆Hibernate OCC吗?

0 投票
1 回答
2023 浏览

c# - asp.net 中带有时间戳和类型化数据集的乐观并发

我正在使用 c# 和 asp.net 为我的网站创建一个论坛系统,对于数据访问,我正在使用类型化数据集,而对于 UI,我正在使用 mvp 模式。在我的数据库中,我存储了已添加到数据集中的过程。问题是数据集不允许我选择“使用乐观并发”复选框,所以我必须自己实现乐观并发。我已经在我的表中添加了一个时间戳列,现在我在为每个用户保存这个值时遇到了问题!那么什么样的状态管理方法是安全的,并且用于保存时间戳值的成本更低?

我想也许最好使用 session 来存储值,但是如果用户的计数增加,我会遇到内存资源问题,但是我可以将 session 设置为使用 sql server 而不是内存,但我不知道这会慢多少所以我无法决定。

任何帮助表示感谢!

编辑1:是的。我想跟踪行的最后修改以查看它是否与用户拥有的匹配。但我不知道在哪里保存用户的时间戳值。

0 投票
3 回答
1978 浏览

c# - 数据集乐观并发

为了处理乐观并发,我需要在我的数据集 C# 客户端中做什么?

除了使用时间戳之外,本文不会详细介绍

0 投票
0 回答
171 浏览

asp.net - 应用乐观并发时不允许我再编辑 ASP.Net?

当我尝试选中数据源中的复选框以检查乐观并发时,我无法再编辑数据。我收到一条错误消息:

“没有为一个或多个必需参数提供值。”

我不确定如何为我的 sqldatasource1 绕过这个。此外,当我尝试插入新记录时,我错过了添加客户 ID 的字段?下面是我的代码。对不起,这还是新手。

0 投票
2 回答
1303 浏览

ravendb - RavenDB 在配置中使用OptimisticConcurrency?

有没有办法在 Raven.Server.exe.config 中将乐观并发设置为 true?或者,它可以以某种方式应用于数据库级别吗?在 RavenDB 的网站上,我看到一些提到设置 UseOptimisticConcurrency = true,但它看起来像是在代码中的会话级别:

我想知道该设置是否存在于服务器范围内的某个地方,因此不需要为代码中的每个会话指定它。

编辑:上面的代码产生以下错误。试图找出原因...

在此处输入图像描述

编辑2:好的,我正在取得进展。如果我检索对象,并在同一个会话中调用 GetEtagFor() ,那么我会得到一个有效的 eTag。所以我想我现在的主要问题是:在客户端 UI 中使用会话的正确方法是在应用程序启动时打开会话一次,然后在最后关闭它?并且... 存储 eTag 的正确方法是什么?按照上面的编码方式,在存储之前就检索了 eTag,我想这是错误的做法。我猜应该在第一次检索对象时检索 eTag。但是当我们最初得到一个对象列表时,我们是否必须遍历每个对象并在它们上调用 GetEtagFor() ?好像不太对...

0 投票
3 回答
1020 浏览

ravendb - RavenDB Catch 22 - 乐观并发和查看其他客户端的更改

使用 RavenDB,IDocumentSession在应用程序启动时创建一个(并且在应用程序关闭之前永远不会关闭它),允许我通过执行以下操作来使用乐观并发:

如果另一个用户更改了该对象,则保存将正确失败。

但是,当在应用程序的整个生命周期中使用一个会话时,我不能做的是看到应用程序的其他实例(例如,五个隔间之外的乔)对文档所做的更改。当我这样做时,我看不到乔的变化:

注意:我也试过这个,但也没有显示 Joe 的更改:

现在,如果我采用另一种方式,并IDocumentSession在每个访问数据库的方法中创建一个,那么我就会遇到相反的问题。因为我有一个新会话,所以我可以看到 Joe 的更改。Buuuuuuut ...然后我失去了乐观并发。当我在保存之前创建一个新会话时,此行会产生一个空的 GUID,因此会失败:

我错过了什么?如果一个 Session 不应该在每个方法中创建,也不应该在应用程序级别创建,那么正确的范围是什么?在执行 Session.Query() 时,如何获得乐观并发的好处以及查看他人更改的能力?

0 投票
0 回答
452 浏览

web-services - 是否有用于乐观锁定的 Web 服务 (WS) 标准?

是否有针对互操作性设计的乐观锁定/乐观并发控制(OCC) 的 Web 服务标准 (WS*)?

有许多与悲观并发控制机制相关的标准,例如WS-AtomicTransaction,但据我所知,它没有提供与乐观锁定相关的版本或时间戳处理功能。

我找到了一篇关于Optimistic locking and WCF的文章,但没有市长标准。是否有这样的,或者您是否知道您想推荐的其他示例或模式?

0 投票
1 回答
1199 浏览

web-services - 如何在 Web 服务更新消息 (DTO) 中使用可选属性?

背景

假设您有一个 (SOAP) Web 服务,BookService用于管理图书馆中的书籍。在信息模型中假设Book实体具有以下属性:

  • id
  • author
  • publisher
  • title
  • shelfId

为了操作数据,定义了四个 Web 服务操作:

  • AddBook
  • GetBook
  • UpdateBook
  • DeleteBook

为每个操作定义请求和响应消息。但是,更新消息 XML 模式的设计更为复杂。我们希望达到以下品质:

  • R1:重置/删除属性的先前值的可能性。例如,说您不再将书保留在图书馆中,因此想重置/清空/删除该shelfId特定书的属性的属性值。
  • R2:避免网络服务中的喋喋不休。请参阅反模式 Chatty Services
  • R3:为未来对并发控制和乐观锁定的需求做准备。我们可能希望最小化(或消除)根据旧信息进行更新的风险。

设计方案

我看到了三个市长备选方案,其中一个有几个子选项来设计更新消息:

  1. 发送整个业务文件。被遗漏的元素(minOccurs="0"在模式中)或元素明确设置为空,即<shelfId xsi:nil="true"/>,将被解释为删除先前的值。
  2. 突出显示更改或仅发送差异。
    1. 发送整个业务文档,但使用特定于此目的的属性标记修改的元素。示例:<author dirty="true">Hemingway<author/>。然后,服务的提供者只更新那些标记为脏的元素并忽略其他元素。
    2. 在消息模式中,将除标识符之外的所有元素设置id为具有minOccurs="0"。消费者发送那些要修改的元素。遗漏的元素不能在语义上被解释为删除。为了删除一个值,NULL必须使用显式 XML 值。示例:<shelfId xsi:nil="true"/>
    3. 发送整个业务文件,同时提交之前阅读文件的副本。然后,提供者可以比较两个文档并更新新文档和先前文档不同的那些属性。
  3. 定义多个操作。不是只使用一个操作,而是UpdateBook根据您认为必须更新的元素定义多个操作,例如UpdateBookAuthorUpdateBookPublisher等等。这些中的每一个都将只有强制元素,并且要删除元素,请使用 XML 的显式 NULL,例如<shelfId xsi:nil="true"/>.

讨论

替代 3的优点是易于理解,但缺点是消费者需要调用多个操作,以防Book要更新实体中的多个字段。这使得服务“健谈”(参见上面的 R3),从而导致性能下降。

Alt 2Alt 1更复杂,但Alt 2有一些与乐观并发控制相关的优点:

  • 对于每个字段的时间戳/版本的乐观锁定存储在数据库中的情况(例如authorVersion)=> Alt 2提供了一种让多个用户同时修改相同部分的不同部分的方法,例如authorpublisherBook同时发生故障的风险较小。
  • 对于在数据库中存储一个完整的单个时间戳/版本的乐观锁定的情况=> Alt 2相对于Alt 1Book没有真正的优势。即使更新只修改了一个字段,请求的版本号太旧也会导致错误。
  • 对于不使用并发控制或乐观/悲观锁定的情况 =>替代2比替代1提供的覆盖旧数据的风险更小,但其他不一致的更改可能会带来问题。

还有另一种情况,其中Alt 2(和Alt 3 )比Alt 1具有优势。消费者可能不会存储有关Book实体的所有数据。例如,如果机器人在更新书架信息时不需要跟踪(缓存)关于作者的信息,而只需要跟踪书架,则可以更有效地对从书架上挑选书籍的机器人进行编程。

替代2.3中的方法的一个优点是,消费者提交以前版本的完整副本而不是版本号或时间戳,即版本号或时间戳不需要数据库中的专用列。

总而言之,我会说Alt 2.2在大多数情况下看起来是最有吸引力的。这里的挑战在于反序列化 XML 的框架必须能够区分遗漏元素和显式设置为 NULL 的元素,例如<shelfId xsi:nil="true"/>. 在此处查看有关此主题的帖子。

问题

您会选择哪种选择?您是否看到其他更好的选择?你怎么看讨论?

0 投票
2 回答
954 浏览

.net - ConcurrentDictionary 的乐观并发 Remove 方法

我在 ConcurrentDictionary 中寻找一种方法,当且仅当值等于我指定的值时,它允许我通过键删除条目,类似于TryUpdate的等价物,但用于删除。

这样做的唯一方法似乎是这种方法:

它是 ICollection 接口的显式实现,换句话说,我必须先将我的 ConcurrentDictionary 转换为 ICollection,这样我才能调用 Remove。

Remove 完全符合我的要求,而且该演员表也没什么大不了的,源代码也显示它调用私有方法 TryRemovalInternal 和bool matchValue = true,所以它看起来很干净。

然而,让我有点担心的是它没有记录为 ConcurrentDictionary 的乐观并发 Remove 方法,因此http://msdn.microsoft.com/en-us/library/dd287153.aspx只是复制了 ICollection 样板文件,并且How to: Add and Remove Items from a ConcurrentDictionary也没有提到该方法。

有谁知道这是要走的路,还是我缺少其他方法?