问题标签 [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 回答
1365 浏览

jpa - JPA - @Version - 读取时增加

我已经实现了一个带有 @version 注释的简单实体 ejb。我希望每次更新实体后版本号都会增加。

但这似乎没有按预期工作。此外,每次我读取实体时,版本号都会自动增加(!?)。我希望版本只在提交后增加?

谁能解释为什么我的版本在阅读时也会增加?

0 投票
1 回答
2460 浏览

entity-framework - 实体框架、PostgreSQL、带有隐藏 xmin 列的乐观并发

我正在针对 PostgreSQL 9.1 数据库使用实体框架(模型优先方法)。

您可能都知道每个表都有一个名为xmin的隐藏列,我将使用它来帮助 EF 在执行更新之前确定该行是否已更改。

我知道 PostgreSQL 的内部结构可能会发生变化,这对于生产代码来说可能根本不是一个好主意,但我想尝试一下。

手动更新模型以在一个表中包含此列并测试其行为所需的步骤是什么?

TIA。

编辑 1:这是我到目前为止的位置,使用带有自我跟踪实体的模型优先方法。

该模型已修改为:

xmin 列在 SELECT 上有效检索,然后在 UPDATE 期间使用:

这里的问题在于 xmin 列上使用的演员表。它失败。到目前为止,我发现它根本不需要演员表。但我不确定如何告诉 EF 在查询此列时完全不使用强制转换。

顺便说一句,xmin 列数据类型是Npgsql ADO.NET 提供程序未知的“xid” 。

编辑 2:这是生成 SQL 文本的提供程序。查看提供程序代码后,我可以确认使用整数数据类型时没有强制转换。因此,我在实体中使用了一个整数来存储值并尝试选择和更新实体。它因并发异常而失败。

pgsql 日志如下:

嗯,检索受影响的行可能存在问题,因为如果手动执行相同的查询,我会更新一行...

编辑 3:我启用了 npgsql 调试日志。当 xmin 没有改变时,我有以下(更新 1):

当它发生变化时,我有以下内容(UPDATE 0):

但不幸的是,在这两种情况下我都有一个 OptimisticConcurrencyException ......

编辑 4:查看 npgsql 日志后,似乎实体框架在内部使用 DbCommand.ExecuteReader(CommandBehavior.SequentialAccess) 后跟 reader.Read() 来确定 UPDATE 语句影响了多少行。

我可能错了,但提供者在 ForwardsOnlyDataReader.Read() 期间返回 false,这可能是问题的根源。

编辑 5:这绝对是提供商问题(版本 2.0.11.93 和即将发布的版本 2.0.11.94)。

对于 INSERT 语句,提供程序仅在基础数据类型为 SERIAL (int) 或 BIGSERIAL (bigint) 时支持计算列。

对于 UPDATE 语句,提供程序不处理给定 DbUpdateCommandTree 的 Returning 属性。这意味着不会返回任何计算列。您必须在调用 SaveChanges() 后手动刷新实体对象。到目前为止,不支持乐观并发。

我将尝试在提供程序中实施最低限度的支持并随时通知您。

编辑 6: Returning 属性现在在我自己的提供程序版本中处理。我很乐意分享我的代码。不要犹豫,问。

0 投票
2 回答
5489 浏览

sql-server - 在更新语句中获取最新的行版本/时间戳值 - Sql Server

我正在使用 rowversion 列来处理乐观并发,并希望在完成更新后取回新的 rowversion 值,以便我的数据层具有最新值并且可以执行另一个更新并获得并发异常(除非记录有已被其他人更新)。

我只是在更新后进入数据层,但这不是非常有效或完全可靠。

对于下表:

我试过了:

但并不完全高兴,因为可能无法从其他人的更新中获取 rowverion 值。然后我在rowversion文档中遇到了OUTPUT语句(http://msdn.microsoft.com/en-us/library/ms182776.aspx/http://msdn.microsoft.com/en-us/library/ms177564.aspx ) 并尝试了这个:

这很好用。在我非常基本的测试中(仅运行 10000 次调用并对其进行计时),OUTPUT 选项需要大约 40% 的时间,但仍不到半毫秒。在 SET STATISTICS TIME ON 的情况下,两者都没有花费任何可测量的时间。

我的问题是,有人知道更好/更简单的方法吗?

我曾希望有一个类似于 SCOPE_IDENTITY() 的函数用于标识列,但找不到类似的东西。有人知道我是否遗漏了什么吗?

提前致谢。

0 投票
1 回答
426 浏览

entity-framework - Entity Framework 如何检测受更新语句影响的行

我正在使用实体框架、模型优先、带有 Npgsql 提供程序的自我跟踪实体(VS2010 - .NET 4 目标)。

我正在尝试跟踪乐观并发异常,但我的问题是,一旦实体中的列被标记为固定,OptimisticConcurrencyException即使受影响的行> 0,也会引发 an。

在这里进行了一些挖掘之后,我想知道为什么实体框架通过dbCommand.ExecuteReader(CommandBehavior.SequentialAccess)后跟 adbDataReader.Read()而不是dbCommand.ExecuteNonQuery()命令文本是简单的更新语句时发出更新命令?

谢谢。

0 投票
1 回答
644 浏览

jdbc - 数据库支持乐观并发

我有一个经典场景:基于该记录中先前准备好的值对同一记录进行两次更新。我在乐观并发的假设下工作。我自己实现条件更新并不难——问题是我是否可以依赖驱动程序或数据库中的某个 API 来为我处理它?

自然地,我用谷歌搜索了它,但我似乎想出的只是对什么是乐观并发的解释,而没有提及代码示例......

我正在使用 JDBC 数据直接驱动程序。

谢谢!

0 投票
1 回答
574 浏览

entity-framework-4 - 克服实体框架中缺少 ConflictMode.ContinueOnConflict 实现的模式?

Linq To SQLDataContext有一个重载SubmitChanges,允许在抛出 Optimistic Concurrency Exception 时继续更新,并为开发人员提供了一种机制,以便之后在单个 Try Catch 块中解决冲突。

甚至它的方法也WCFDataServicesContext有一个SaveChangedOptions.ContinueOnError参数 SaveChanges,至少允许您在发生错误时继续更新,并使冲突更新未解决,以便您稍后查看它们。

(1) 那么为什么该ObjectContext.SaveChanges方法没有这样的选项呢?

(2) 是否存在任何模仿 Linq To SQL 行为的更新模式?我在 MSDN 上找到的示例使它看起来好像单个 Try Catch 块会在多次更新的情况下让您回家。但是这种模式不允许您单独调查每个有冲突的更新:它只是提醒您注意第一个冲突,然后让您选择“一次性清除表”以防止出现任何进一步的乐观并发异常,而无需您的知道是否存在,以及您希望如何处理它们。

0 投票
1 回答
1138 浏览

asp.net - Devexpress ASPXGridView 和 EntityFramework 4.3.1 的并发异常

我的问题

我有一个用于测试并发性的简单 WebForms 项目。

我在用:

现在我遇到了并发检查的问题。

即使我是唯一一个编辑数据的用户,如果我使用 DevExpress ASPXGridView 两次编辑相同的记录,我也会遇到并发异常!

我得到的例外是: System.Data.OptimisticConcurrencyException

我的设置

** 为简洁起见,此处进行了简化

我的代码优先实体定义如下:

您可以看到我添加了一个名为 LastUpdate 的字段,由于设置了 [ConcurrencyCheck] 属性,正在测试并发检查。

在我的带有 DevExpress ASPXGridView 的网页上,我使用 EntityDataSource 在网格视图和实体框架之间进行绑定。网格视图正在使用弹出编辑器。我有以下事件:

我还连接了一些按钮事件来测试直接并发测试。

例如

例如

这些按钮按预期工作。只有网格更新似乎有问题。

也许是因为网格需要使用 ObjectContect 而我的实体框架类使用的是 DBContext?

我尝试的修复

我搜索了互联网试图找到解决方案。检查了 DevExpress 论坛,检查了 StackOverflow 上的其他帖子,互联网上的各种帖子,关于并发的 Microsoft MSDN 文章,我就是无法解决这个问题。

  • 没有一个帖子像我的那样“简单”。他们都涉及其他数据。例如主/细节relashionship。自定义编辑器。等等我正在使用所有内置的 DevExpress 控件,只在我的数据库表/实体上显示一个网格视图。

  • 一些帖子建议刷新实体。我试过这个,但得到一个异常,说实体没有在对象状态管理器中被跟踪。

  • 我尝试通过销毁和重新创建我的对象上下文/数据库上下文来刷新实体框架,但不知何故我仍然遇到并发问题。

  • 我尝试使用 DBContext 和 ObjectContext 进行刷新。都没有奏效。(objContext.Refresh(RefreshMode.StoreWins,实体)。我要么得到一个异常,如前所述]实体没有被跟踪,或者如果我告诉它只刷新未修改的实体,那么什么都不会发生(没有刷新,没有例外)

  • 我尝试将我的 DBContext 设为全局,但这并不好,因为 WebForms 似乎想要在每次 Web 刷新后重新创建其整个状态并重新挂钩其网格数据上下文等。(页面加载,用户点击编辑,用户点击确定更新)

现在所有这些解决方案似乎都考虑了在并发异常之后要做什么。看到我什至不应该首先得到例外,我想他们不会有帮助。

建议

你们中有人对如何进行这项工作有任何建议吗?

从网格发布数据后,我是否必须强制实体框架手动刷新?(我现在才想到这个)

我的设置似乎很简单。也许我错过了一些非常明显的东西。我还没有过多地使用 WebForms 或 EntityFramework,所以我可能缺少一些简单(而且可能很明显)的解决方案?

任何帮助表示赞赏。

谢谢彼得梅斯

0 投票
1 回答
1505 浏览

c# - 刷新后重新抛出实体框架OptimisticConcurrencyException

我正在使用时间戳列来检查我的实体中的并发性。当 2 个不同上下文中的数据不相同时,会正确抛出异常。

当保存的时候出现这样的异常,我调用下面的方法来处理:

我检查了,刷新是在每个故障实体上执行的。但是,第二个SaveChanges()总是重新抛出一个OptimisticConcurrencyException.

难道我做错了什么 ?

提前致谢

编辑

我注意到问题是由于第一次之前的方法调用而出现的SaveChanges()

如果我注释掉UpdateFlags()电话,我没有问题。

这是此方法的代码:

但是我看不出问题出在哪里,因为这是在第一次之前完成的SaveChanges()

0 投票
2 回答
1502 浏览

.net - 实体框架实体更新忽略时间戳

我正在尝试实现乐观并发检查。我使用通用存储库和工作单元模式。

我已经向我的实体引入了时间戳属性(作为字节数组),每当我更新数据时它会自动增加值(似乎是数据库管理的,这是它应该做的)。

我通过将 VM 映射到实际模型(使用 automapper)从视图模型加载更新的值。这会产生一个正确类型的实体的新(分离?)实例,并设置了所有相应的字段(包括时间戳)。

更新本身的执行方式如下

i_oEntity 是自动映射的实体。

这会很好地更新值本身,但是它完全忽略了来自视图模型的时间戳值。生成的 SQL 代码在 WHERE 子句中使用最新的 rowversion 值。

简而言之:如何让我的 viewmodel-timestamp 值在 EF 的 WHERE 子句中使用?

0 投票
1 回答
7287 浏览

c# - 如何使用 EF 5.0 Code First 启用并发检查?

我想在原子操作中进行检查然后更新。我正在使用 dbcontext 来管理事务。如果记录已被另一个线程修改但没有引发异常,我希望得到一个异常。任何帮助,将不胜感激。这是我的输出:

这是我的代码片段: