问题标签 [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.
inheritance - Entity Framework 4:继承和乐观并发
我正在使用 AdventureWorks 2008 R2 数据库并将 BusinessEntity 和 Person 表添加到我的 EDMX。然后我更改了 Person 表从 BusinessEntity 表继承的模型。您可能知道这两个表具有 ModifiedDate 和 rowguid 列,因此 Person 类不应具有这些属性,因为它从 BusinessEntity 类继承它们。
我的问题是,如何修改模型以支持修改日期属性/列上的 Person 和 BusinessEntity 类/表的继承和乐观并发。
PS。它还给我一个我在这里问过的错误消息。
谢谢
django - django 管理员更改视图中的并发性
我的模型:
许多用户将在短时间内通过管理员更改页面访问给定记录,因此我遇到了并发问题:
用户 1 和 2 同时打开更改页面。假设加载页面时所有值都是空白的。用户 1 将 property_a 设置为“a”,将 property_b 设置为“b”,然后保存。一秒钟后,如果用户 2 更改属性 b 并且 c 然后保存,它将悄悄地覆盖用户 1 的所有值。在这种情况下,property_a 将恢复为空白,而 b 和 c 将是用户 2 输入的任何值。
我需要有关如何处理此问题的建议。如果我必须在模型中有一个版本字段,我如何将它传递给管理员,我在哪里进行检查,以便我可以优雅地通知用户他们的更改无法保存,因为另一个用户修改了记录?有没有比只向用户返回错误更无缝的方法?
entity-framework - Entity Framework 4 中是否允许可以为空的外键?
我在更新实体框架实体中的外键时遇到问题。我正在使用自我跟踪实体,并且有一个具有某些关系的实体,其中外键也作为属性存在(EF4 的新功能之一)。键(一个整数)被标记为 Nullable 和 Concurrency Mode fixed。
具体来说,我有一个与确认用户具有多对 0..1 关系的警报实体。(一个用户可以确认多个告警,但一个告警只能被零个或一个用户确认)。
实体定义(简化):
在我的自我跟踪实体中,确认用户 id 会自动生成为 Nullable,就像预期的那样,但是如果我将用户分配给已经持续存在的警报并运行 ApplyChanges,则自我跟踪上下文扩展会尝试将原始值(null)设置为EF 上下文(在上下文扩展中的 SetValue 中),但会默默地跳过它,因为 EdmType 的 ClrEquivalentType 是不可为空的 Int32。
自动生成的扩展代码:
当 EF 稍后尝试更新我的警报时,我得到一个 OptimisticConcurrencyException,因为它在 UPDATE 语句中构造了一个 WHERE 子句,它使用 0(零)作为原始用户外键值,而不是正确的“is null”。(WHERE 子句是 EF 乐观并发机制的一部分,其中标记为“固定”并发模式的属性的原始值会与数据库中的属性进行检查)。
EF 的自跟踪实体是否不完全支持可为空的外键/原始类型?如果不是,我是否被迫使用虚拟实体而不是 null 或者是否有其他解决方法?
更新 我试图在没有 STE 的情况下重现该问题,但普通 EF 似乎可以很好地处理可空外键的乐观并发,所以这是一个 STE 问题,而不是 EF 问题。自我跟踪实体存在许多问题,因此这里出现故障也就不足为奇了。如果我找到可以在 STE T4 脚本中实现的解决方法,我将在此处发布。
user-interface - 对于乐观并发失败,什么是好的最终用户消息
我试图想出一些好话来向用户解释一个乐观的并发异常。事实证明,这比我想象的要困难得多。到目前为止我最好的是:
其他人已经修改了您正在处理的记录。它们的新值如下所示。请重新进行您所做的更改。
这对我来说有点糟糕,它们一定是更好的东西。有什么想法吗?
linq-to-sql - 如何让 Linq-to-SQL 忽略由 INSERT 触发器修改的列?
我的一个表上有一个列正在由我的数据库中的各种 INSERT/DELETE 触发器更新 - 触发器根据链接表的内容执行一些计算,并将结果存储在基表的列中以便于查询等。
当我尝试更新这些表时,Linq-to-SQL 抛出 ChangeConflictException - 大概是因为触发器正在修改此列,因此 L2S 认为存在数据冲突。
我正在寻找的确切行为如下:
- L2S 应在检索对象时检索此列值
- L2S 应忽略对此列值的更改 - 代码中所做的更改不应保存到数据库
- 储蓄冲突应该被忽略。
- (如果可能的话)应该在任何插入/更新操作之后从数据库中检索最新值 - 但如果它很困难,我可以没有这个。
谁能帮我在 Linq-to-SQL 中实现这种行为?
谢谢,
迪伦
c# - 如何解决 c# .NET N 层应用程序中的乐观并发更新?
大家好。
在 c# .net VS 2008 中,我正在开发一个 N 层 CRM 框架解决方案,完成后我想分享它。
该架构基于:
数据访问层、实体框架、业务逻辑层、WCF,最后是表示层(win forms)。
在某处我读到,超过 2 层是有问题的,因为乐观并发更新(具有相同数据的多个客户端事务)。
在最大。2 层解决方案这应该不是问题,因为控件(如 datagridview)自己解决了这个问题,所以我问自己使用 2 层是否更好,从而避免乐观并发问题?
实际上,我想为大型项目而不是 2 层制作 N 层解决方案。我不知道如何解决这样的并发问题,希望在这里得到帮助。
当然应该有一些很好的机制来解决这个问题......也许有任何建议、例子等?
感谢你在期待。
最好的问候, Jooj
optimistic-concurrency - 2 threads performing myAtomicReference.compareAndSet(expected,new Date())
Q: If 2 threads executes it, which object will get stored in the atomic reference?
In a multi-processor machine, 2 threads could be performing the CAS in the same clock cycle. Suppose they both use the same myAtomicReference object to do the CAS, both use the correct value of "expected", but they try to put in 2 distinct objects ie the 2 newDate. One of them must fail, but will myStatus be false in that thread?
I guess one hardware implementation of CompareAndSwap would make the threads queue up to do their updates. I guess even if the 2 processors are executing the CAS instruction in the same clock cycle, one of them is probably delayed.
asp.net - 我应该在删除之前检查一行是否存在吗?
我使用 Mssql 作为数据库,使用 EF4 作为 ORM/DAL。
我的问题是关于以下代码:
如果该行存在,则效果很好,否则我得到一个异常(存储更新,插入或删除语句影响了意外数量的行(0)。自加载实体以来,实体可能已被修改或删除。刷新 ObjectStateManager 条目。)
我是否应该往返于数据库以检查该行是否存在,如下所示:
我认为额外的往返是不必要的,因为没有 EF,使用纯 SQL,我可以使用单个 DELETE 命令简单地删除该行。
什么是更好的做法?
c# - 使用实体框架解决乐观并发更新问题
当一个用户更新另一个用户已经更新的输入时,我应该如何解决模拟更新?
第一个用户请求“类别”实体对象,第二个用户也这样做。
第二个用户更新此对象,第一个用户更新。
我在数据库中有字段时间戳字段设置为并发模式 - 已修复。
这就是我更新的方式:
异常从不跳转......
我应该如何处理这个?
database - Linq to Sql - 如何使用存储库模式更新对象?
有很多关于这方面的信息,但即使在阅读了几个小时之后,我似乎也无法让它按照我想要的方式工作。
我试图通过传入一个用户对象来更新一个用户对象,并一般比较我从数据库中提取的用户对象的更改。使用此方法时,我总是最终得到 NotSupportedException:
已尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。这是不支持的。
这是我尝试的方法:
我试过的注释掉的行也没有注释,但这没有帮助。
如果我注释掉 foreach() 循环并添加一行 dbUser.UserName = "Cheese"; 它会更新数据库中的用户名。这使我相信这是因为 foreach() 循环如何更改导致此失败的 dbUser 对象。
当我调试 dbUser 对象时,它似乎正确地获取了作为参数传递的 User 对象的所有更改。
我还阅读了一些关于乐观并发的内容,并在数据类型时间戳的表中添加了一列,但这似乎也没有任何效果。
我在这里到底做错了什么?
我怎样才能让它一般地检测到发生了什么变化并正确地将更改保存到数据库中?