问题标签 [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 投票
1 回答
108 浏览

.net - 使用查询时的数据库值更新附加实体的属性

我有一个具有整数属性(名为 ROW_VERSION)的实体类,其中 ConcurrencyMode 设置为“Fixed”以进行乐观并发检查。在保存此类型的实体之前,我会在我的应用程序代码中增加此列的值(因此 StoreGeneratedPattern 设置为 None)。这在保存更改时效果很好。

现在,当我有一个先前加载的实体(使用 ROW_VERSION = x)并创建一个新的 DbContext、附加此实体并发出涉及此实体的查询时,我还想检测并发错误。那里的问题是,如果 ROW_VERSION 被另一个客户端应用程序(ROW_VERSION = x + 1)增加,这在我的查询过程中没有被检测到,因为附加实体的值显然具有优先级(这对于常见的列值完全有意义)。

另一方面,对于我的并发检查列,如果 EF 使用当前数据库值更新该值,那就太好了,这样我就可以将它与预期值进行比较。或者,从查询执行中抛出的异常是可以接受的。

我将实体框架 4.3 与 .NET 4.0 一起使用。

编辑(回应 Gert Arnold 的评论):

我试图进一步澄清我的问题......

我的应用程序一般如何工作的注意事项:

  • 有一个树视图显示我可用的实体对象,在选择一个时,从数据库加载完整实体以显示在详细视图中,可以在其中进行编辑

  • 对实体对象的修改不会立即保存,而是缓存在内存中,因此当用户点击保存按钮时,不同实体对象的修改会堆积起来并一起保存。

  • DbContext 是单独创建的,用于查询和保存更改(即,我并不总是拥有相同的 DbContext,但它们会根据需要进行实例化)。

  • 当加载实体对象以在详细视图中显示时,所有先前修改的实体对象(被缓存)都附加到首先用于查询的 DbContext。然后发出实际的查询。因此,如果我查询一个实体对象,该对象在我将获得修改后的版本作为结果之前已被修改,而不是来自数据库的版本(同时可能已更改)。

所以这是一个显示我的问题的例子:

  1. 客户端应用程序 1 加载 ROW_VERSION = 1 的实体对象,释放 DbContext 并保留对该实体对象的引用以供进一步编辑。

  2. 客户端应用程序 2 加载步骤 1 中提到的相同实体对象,更改属性并保存更改。这会导致数据库中的 ROW_VERSION 递增(现在为 2)。

  3. Client App 1 的用户现在更改了实体对象的一些属性(它仍在内存中,ROW_VERSION 为 1)。

  4. 在客户端应用程序 1 保存更改之前,它会加载一些其他实体对象以进行显示,并最终再次选择有问题的实体对象(例如,查看所做的更改)。这会导致查询结果将包含已更改的实体对象(因为它在实际查询发送到数据库之前附加到 DbContext)。

    这是我的问题:此时实体框架可以将附加对象的 ROW_VERSION 与实际查询结果中的对象的 ROW_VERSION 进行比较,检测不匹配并例如抛出异常。

    但相反,EF 将 ROW_VERSION 属性视为可能刚刚被客户端更改的所有其他属性。

所以我希望 EF 特别对待 ROW_VERSION 属性并在每个查询中比较它的值以检测其他客户端的更改。这样,我会在等待 SaveChanges 调用之前检测到并发情况。

0 投票
1 回答
915 浏览

java - Hibernate/JPA 版本并发控制和 DTO/更改命令模式

我想使用@VersionJPA 和 Hibernate 进行乐观并发控制。

我知道它在两个并行事务的典型场景中是如何工作的。我还知道,如果我有一个在表单和实体之间具有 1:1 映射的 CRUD,我可以将version其作为隐藏字段传递并使用它来防止用户同时进行修改。

更有趣的情况如何,使用 DTO 或更改命令模式?是否也可以@Version在这种情况下使用,以及如何使用?

让我给你举个例子。

现在假设两个用户为此打开 GUI,进行一些修改并保存更改(不是同时,因此事务不会重叠)。

如果我传递整个实体,第二个事务将失败:

这很好,但我不喜欢到处传递实体的想法,有时会使用 DTO、更改命令等。

为简单起见,更改命令是一个映射,最终在某些服务上用于这样的调用:

显然,如果两个用户打开我的 GUI,都进行了更改,然后一个接一个地执行,在这种情况下,两个更改都将被应用,最后一个将“获胜”。我希望这种情况也能检测到并发修改(第二个用户应该得到一个异常)。

我怎样才能实现它?

0 投票
2 回答
39938 浏览

postgresql - 通过 RAW plpgsql 中的 UPDATE 语句获取受影响的行

这已经在这里这里多次询问,但没有一个答案适合我的情况,因为我不想在 PL/PgSQL 函数中执行我的更新语句并使用GET DIAGNOSTICS integer_var = ROW_COUNT.

我必须在原始 SQL 中执行此操作。

例如,在 MS SQL SERVER 中,我们有 @@ROWCOUNT ,可以像下面这样使用:

在数据库的一次往返中,我知道更新是否成功并返回计算值。

可以使用什么来代替 '@@ROWCOUNT' ?有人可以确认目前这实际上是不可能的吗?

提前致谢。

编辑 1:我确认我需要使用原始 SQL(我在原始描述中写了“原始 plpgsql”)。

为了使我的问题更清楚,请考虑更新语句仅影响一行并考虑乐观并发:

  1. 客户SELECT首先做了一个声明。

  2. 他构建了 UPDATE 并知道哪些数据库计算列将包含在 SELECT 子句中。除其他外,谓词包括每次更新行时计算的时间戳。

  3. 所以,如果我们返回了 1 行,那么一切正常。如果没有返回任何行,那么我们知道之前有更新,客户端可能需要在再次尝试更新子句之前刷新数据。这就是为什么我们需要在返回计算列之前知道有多少行受更新语句影响。如果更新失败,则不应返回任何行。

0 投票
1 回答
57 浏览

audio - 哪些音频 API 可以支持推测性评估和校正?

推测性评估(又名推测性执行)是一种以偶尔返工(低效率)为代价实现低延迟代码的有效方法。推测评估是现代计算机体系结构的一种常见的低级技术,但它可以在更高级别的编程模型(参见时间扭曲协议、时间逻辑、反应式编程模型)中得到支持。

一个似乎推测性评估特别有用的地方是音频的实时计算,例如用于实时编码或游戏。这个想法很简单:我们可以推测性地填充音频缓冲区以防止缓冲区欠载,但如果我们必须对任何最后即时更改做出反应,则偶尔会纠正这些缓冲区。这种技术仍然可能出现故障。零散的更新可能会从前面砍掉一点。但是由于大多数推测的声音应该仍然大部分是正确的,因此与典型的欠载相比,这是一种不同的 - 并且可能更优雅的故障模式。

现在,我想知道哪些音频 API 或库最有效地支持这些对现有缓冲区的最后即时更新。我不是声音编程方面的专家,但我见过的大多数示例代码似乎都假定了对缓冲区的承诺。如果我在加载缓冲区后承诺使用缓冲区,那么别无选择,只能在延迟和欠载风险之间进行权衡。哪些音频 API 不需要承诺?

0 投票
1 回答
1692 浏览

entity-framework - DbContext,处理并发异常

使用 EF DbContext。我的实体对象有 rowversion 列(SQL Compact edition ver 4),用于并发检查(ConcurrencyMode = Fixed,StoreGeneratedPattern=Computed)。

为了强制并发异常,我从 UI 中读取了 2 种不同形式的相同表记录,分别编辑它们,并一个接一个地保存。以下代码执行实际的保存操作。

单击第二个表单上的保存按钮时,按预期发生并发错误。但是,在从数据库复制原始值之后,第二次尝试时异常仍然存在。只有第三次尝试成功,没有任何错误。有人可以解释一下可能导致此问题的原因吗?

编辑:我发现它发生在我通过 UI 进行两次更新时。如果在上面的代码中,在第一次尝试之前,我会执行以下操作:

然后代码按预期工作,因为 myEntity 的另一个实例是通过 UI 更新的;即第二次尝试将保存myEntity。而且,问题出在以下行:

因为,当通过 UI 更新时,exc.Entries 返回的不是发生并发错误的实体,而是它的导航属性实体。

在这种情况下,MyEntity 是一个树状自引用实体,它有两个导航属性:ParentEntity 和 Children。

因此,在第一次保存尝试之后,我在 exc.Entries 中拥有的是 ParentEntity(处于未更改状态),并且只有在第二次保存尝试之后,exc.Entries 返回引发并发错误的实际实体。

0 投票
0 回答
70 浏览

linq-to-sql - LINQ ChangeConflictException 问题/自定义属性

我有一个包含项目任务的数据库表。每个任务都基于一个任务模板,该模板存储在同一个表中。除非另有说明,否则任务从其关联的任务模板记录继承属性/字段。我已经在这个表的数据模型中创建了一个自引用关联——TaskTemplateId 指向模板的 ID。

我有很多问题。即使我没有更改表中的任何数据,我也会在更新时收到 ChangeConflicException。

从理论上讲,我是否以正确的方式解决这个问题?有没有人遇到过这两个问题?

列名 X 在结果列列表中出现多次。

这是一个示例属性:

一些注意事项:

  • 我已将此表的所有非 PK 列上的 UpdateCheck 设置为从不。

编辑:所以,这是 LINQ 发送到服务器的更新语句:

这不奇怪吗?其中 0 = 1?下面的代码是从服务器获取项目任务;它在该更新语句之后触发此代码四次。

更新语句由 UserControl 中的 LinqDataSource 触发。一切都发生在标记中,除了自定义属性,其示例位于顶部。

一如既往,感谢您的帮助。

0 投票
1 回答
297 浏览

javascript - 淘汰赛映射选项;将 JSON 属性映射到两个视图模型属性

为了在将(可能)修改后的视图模型发布/保存回服务器时进行乐观并发检查,我想在一个单独的变量中获取原始值的副本,而不是使用淘汰绑定绑定到的可观察变量。

这可能与淘汰映射插件有关,还是在填充视图模型后我必须遍历映射的可观察对象以获取副本?

0 投票
3 回答
389 浏览

c# - 在 EF 4 中更新记录时的乐观并发

我在 VS 2012 中调试时收到此异常

ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

我花了将近一周的时间尝试使用以下模式解决乐观并发问题:DbFactory、工作单元、DI、通用存储库,但没有得到结果。

0 投票
0 回答
385 浏览

c# - 实体框架 OptimisticConcurrencyException 问题

我正在使用实体框架 4。在一个表单中,我有一个DataGridView分配为DataSource. 然后,我有两个按钮。删除historial_borrarlist() 的最后一个 entity() lista_historial_prestamo,实际上是 的第一行DataGridView

然后,另一个按钮将一个新实体添加到数据库中。

每次单击按钮时DataSource,我显然都会刷新DataGridView( ) 。dgv_Historial_estado_prestamo

这个想法是,如果我添加一个,我可以在它之后删除那个。

如果我添加一个,然后删除那个。我得到一个OptimisticConcurrencyException.

我真的不知道为什么!我SaveChanges()每次删除对象或将其添加到数据库中。我也将其从datasource列表中删除。

仅当我在添加对象后删除对象时才出现此异常。

我一直在阅读一些帖子并尝试过这个:

这段代码没有例外,但是当我关闭并重新打开该表单时,我删除的所有对象实际上都在那里。

0 投票
1 回答
803 浏览

entity-framework - 来自 DTO 的 Entity Framework 5 并发更新

我们正在使用随 VS 2012 提供的 Framework 4.5 和 EF 5.0。我们有一个实体,其中包含一个名为 RowVersion 的列,我计划将其用于并发检查。它是 MySQL 表中的一个“时间戳”值,它在插入或更新记录时会自行更新。

默认 EF 5 代码生成生成此 POCO:

我已将“RowVersion”属性的并发模式设置为“fixed”以启用并发检查,“StoreGeneratedPattern”设置为“Computed”。我们使用通过自动映射器映射的 DTO 通过 WCF 服务发送数据。

我们在更新通过服务返回的实体时遇到了一些问题。这是一些代码:

即使“rowVersion”没有改变,这总是会引发 OptimisticConcurrencyException。这是由将 DTO 映射回实体引起的吗?

有人可以指出我正确的方向吗?

问候