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

azure - 是否可以使用 Azure 表存储进行条件插入

是否可以使用 Windows Azure 表存储服务进行条件插入?

基本上,我想做的是将新行/实体插入到表存储服务的分区中,当且仅当自上次查看以来该分区中没有任何更改时。

如果您想知道,我想到了事件溯源,但我认为这个问题比这更笼统。

基本上我想读取部分或整个分区并根据数据内容做出决定。为了确保自加载数据以来分区中没有任何变化,插入应该表现得像正常的乐观并发:只有在分区中没有任何变化时插入才应该成功 - 没有添加、更新或删除行。

通常在 REST 服务中,我希望使用 ETag 来控制并发,但据我所知,分区没有 ETag。

我能想出的最佳解决方案是为包含时间戳/ETag 的表中的每个分区维护一个单行/实体,然后将所有插入作为包含插入的批次的一部分以及对此的条件更新时间戳实体'。但是,这听起来有点麻烦和脆弱。

Azure 表存储服务可以做到这一点吗?

0 投票
1 回答
3766 浏览

entity-framework - 在实体框架中处理并发

我正在寻找在使用实体框架时处理并发的最佳方法。这里描述了最简单和最推荐的(也在堆栈上)解决方案:http: //msdn.microsoft.com/en-us/library/bb399228.aspx 它看起来像:

但够了吗?如果 Refresh() 和第二个 SaveChanges() 之间发生了变化怎么办?会有未捕获的 OptimisticConcurrencyException 吗?

编辑2:

我认为这将是最终的解决方案:

我不确定我是否理解 Refresh() 的工作原理。它会刷新整个上下文吗?如果是,为什么需要额外的参数(实体对象)?还是只刷新指定的对象?例如在这种情况下,应该作为 Refresh() 第二个参数传递什么:

应该是 dbOrder 吗?

0 投票
1 回答
259 浏览

mysql - 使用 MVC3 的 MySql 在调用 context.savechanges 时出错

我试图让我的 MVC3 应用程序使用 MySql 数据库而不是 Sql Server 2008。我在 Mysql 中创建了关联的数据库和对象。并更新了我的 web.config 文件中的连接字符串以引用 MySql.Data.MySqlClient。

当我运行我的应用程序并尝试登录时,我收到了错误

我有一个自定义 MembershipProvider 并且在验证过程中我有以下

上面的代码在 Sql Server 2008 上运行得很好,但只在 MySql 上失败了。知道如何解决这个问题吗?

顺便说一句,我没有在基础表上定义任何触发器。该应用程序是带有 EF Code First 的 MVC3。谢谢,

0 投票
2 回答
1395 浏览

asp.net-mvc-3 - 即使我将 FormCollection 传递给我的 Post 操作方法而不是对象,如何强制引发 DbUpdateConcurrencyException

我在我的 asp.net mvc web 应用程序中有以下操作方法,它将引发一个DbUpdateConcurrencyException预期的处理可能发生的任何并发冲突:-

但是为了避免任何过度绑定攻击,我[Bind(Include = "Date, Title")] 在对象类上定义了一个,但这给我带来了一个问题,因为即使没有发生并发冲突,上述操作方法也会返回异常,因为模型绑定器将无法绑定对象ID 和其他值,所以我已将我的操作方法更改为以下内容:-

但是像第二种方法一样编写动作方法在任何情况下都不会引发DbUpdateConcurrencyException(即使发生并发冲突!!!)。

所以我的问题是,如果发生任何冲突,我如何确保DbUpdateConcurrencyException将提出,同时通过定义确保不会发生过度绑定攻击[Bind(Include = "Date, Title")]?提前感谢您的任何帮助和建议。 BR

0 投票
3 回答
987 浏览

asp.net - System.Web.Providers 的 OptimisticConcurrencyException

我正在使用 Microsoft 的新通用提供程序在 SQL Server 中进行会话。SQL Server 上会话的旧实现需要一个作业(每分钟运行一次)来清除过期的会话。新的对每个请求进行检查和清除。因为我实际上是在 SQL Azure 中运行,所以我没有 SQL 代理来安排作业,所以这听起来是一种合理的方法(不,我不想为会话支付 Azure 缓存)。

问题是当多个用户同时访问该站点时,他们都试图同时清除相同的过期会话,而第二个用户则获得了乐观并发异常。

我正在使用 ELMAH 进行错误记录,并且这种情况经常出现。在我尝试将 ELMAH 配置为忽略错误之前,是否有人知道首先阻止错误发生的方法?我缺少的新提供程序是否有一些配置?

0 投票
1 回答
3890 浏览

.net - EF Concurrency Handling with Timestamp attribute in Model First approach

I am trying to implement the solution given in Handling Concurrency with the Entity Framework in an ASP.NET MVC Application .

The article says:

Adding a Tracking Property to the Department Entity

In Models\Department.cs, add a tracking property:

The Timestamp attribute specifies that this column will be included in the Where clause of Update and Delete commands sent to the database.

Since I'm using a model first approach, I followed steps 1 - 5 outlined in Creating a Timestamp column with Entity Framework

  1. Add a property named “Timestamp” to the entity in EF’s model
  2. Set the type to binary
  3. Set nullable to false
  4. Set StoreGeneratedPattern to Computed
  5. Set ConcurrencyMode to Fixed

When I update my code from the database model, the Models\Department.cs now contains

Then I used the metadata class to specify the Timestamp attribute:

Q1. I tested whether the value of the Timestamp column is changing in case of row edits. It isn't.

EDIT 1 The problem was caused because the SQL Server column type was binary, where it should have been of type timestamp. Changing the data type fixed the issue of the Timestamp column not getting updated.

Q2. I was trying to modify the same entity (using "Open in new tab") to see if an OptimisticConcurrencyException is thrown. It isn't. What am I doing wrong? Please help me understand, thanks.

Screenshot of my <code>Timestamp</code> property

0 投票
1 回答
417 浏览

entity-framework-4 - 将视图转换为表和 savechanges 给了我乐观的并发异常

我正在使用 Entity Framework 4(使用自跟踪实体),并访问一个视图,即两个表的合并。因此,当我更新视图的信息时,我将视图的 STE 发送到访问数据库的存储库。

我做了以下事情:

当我收到包含更新信息的视图时,我创建了我的 STE1 和 STE2。当我创建一个 STE 时,它是如何使用添加状态创建的。那么我如何知道状态被修改的观点的STE的状态,我用方法改变了我的两个STE的状态MarkedAsModified

然后,我如何在视图的 STE 中查看这两个表的信息,我将视图中的信息传递给正确的 STE,并将 STE 中的更改应用到objectContext.

最后我制作了saveChanges. 但在这一步中,我收到一个Optimistic concurrency exception. 我认为这是因为 STE 从状态传递到AddedModified所以上下文检测到在创建和之间有一些修改SaveChanges,但我也尝试AcceptChanges在 STE 中,后来标记为已修改和,最后应用更改SaveChanges,但是问题仍然存在。

我该如何解决这个问题?有更好的方法来使用视图和实体框架 v4?

谢谢。戴姆洛克。

编辑1:我仍然有问题。我的代码如下:

组件 myComponent = new Components(); //这是一个 STE myComponent.Rereference = myView.Reference; ... //其他属性 myComponent.MarkedAsModified(); //这是必需的,因为我要更新信息,不添加新寄存器。myContext.ApplyChanges("组件", myComponent); miContexto.SaveChanges();

在 saveChanges 中,我得到了异常:更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

哪个是问题?我可以不修改创建的新STE吗?

谢谢。

0 投票
1 回答
1141 浏览

entity-framework - 实体框架和乐观并发异常的一些一般疑问

我对乐观并发异常有些怀疑。

好吧,例如,我从数据库中检索一些数据,修改一些寄存器,然后提交更改。如果有人在我的请求和我的更新之间更新了寄存器的信息,我会得到一个乐观的异常。经典的并发问题。

我的第一个疑问如下。EF判断信息是否改变,从数据库中检索数据,并将我获得的原始数据与从数据库中检索的数据进行比较。如果存在差异,则抛出乐观并发异常。

如果当我捕捉到乐观并发异常时,我决定是客户赢还是商店赢。在此步骤中,EF 再次检索信息还是使用第一次检索的数据?因为如果再次检索数据,将是低效的。

第二个疑惑是如何控制乐观并发异常。在 catch 代码块中,我决定是客户获胜还是商店获胜。如果客户赢了,那么我再次调用 saveChanges。但是在我决定客户端获胜和保存更改之间,其他用户可以更改数据,所以我再次得到一个乐观并发异常。理论上,它可能是一个无限循环。

使用事务(范围)来确保客户端更新数据库中的信息是个好主意吗?其他解决方案可以使用循环尝试 N 次更新数据,如果不可能,退出并告诉用户。

交易会是个好主意吗?它会消耗大量数据库资源吗?虽然事务会暂时阻塞数据库,但它确保更新操作完成。循环N次尝试完成操作,调用数据库N次,可能需要更多的资源。

谢谢。戴姆洛克。

编辑:我忘了问。是否可以将上下文设置为默认使用客户端获胜而不是等待并发异常?

0 投票
3 回答
2845 浏览

asp.net - 使用 SqlDataSource 删除时出现空字典错误 - ASP.net ListView

我正在尝试制作一个具有乐观并发的简单 ListView。它使用 VS 自动生成的 Delete、Insert、Update 语句(除了 1 处更改为插入:见代码)。插入和编辑工作正常并提交到数据库。尝试删除时,出现此错误:

您已指定您的删除命令比较 SqlDataSource 'MySourceHere' 上的所有值,但传入值的字典为空。传入有效字典以删除或将模式更改为 OverwriteChanges。

我尝试将“CompareAllValues”更改为“OverwriteChanges”以推迟并发工作,但这会“中断”更新和删除命令,这似乎只是用旧值刷新 ListView。我能找到解决此问题的唯一线程涉及更改为“OverwriteChanges”,或者是没有声明“DataKeyNames”的人。相关标记如下(我希望)。

有什么想法吗?

0 投票
1 回答
1217 浏览

hibernate - 在spring mvc(休眠)中处理并发

我很难相信我是唯一一个想知道实现这一点的正确方法的人,但不幸的是我的搜索没有返回任何好的解决方案。

基本上我们有使用 spring mvc 和 hibernate 实现的 web 应用程序。由于它是一个指向 jsp 页面的 MVC 模型,因此我们在完成请求后释放对象,然后在执行更新之前从 ID 重构。

考虑到并发性重新设计它的最佳方法是什么?(现在我们不考虑并发!!)是的,我们可以将版本保存为 JSP 中的隐藏字段并在发布请求中发送,但这似乎不是一个“优雅”的解决方案。有没有更好的办法?