【问题标题】:Does a concurrect exception happen to both user两个用户是否都发生了并发异常
【发布时间】:2012-06-12 14:27:24
【问题描述】:

如果一个用户编辑了一条数据记录,同时另一个用户也编辑了同一条记录并且都保存了。

1.) 并发异常是否总是只发生在一个用户身上?

实际上,先赢是合乎逻辑的,但在技术方面谁是第一……是否有可能两个用户都遇到这种异常?

2.) 那个为时已晚,现在得到并发异常的人,我猜他可以访问

来自其他用户的新更新数据记录是吗?

【问题讨论】:

标签: c# sql-server exception-handling concurrency data-access-layer


【解决方案1】:

Read committedsql server 的默认隔离级别:

如果并发请求访问一个对象,则 sql server 为它们创建队列并一一处理。第二个用户将等待用户 1 完成任务的预定义时间,如果无法在该时间范围内完成任务,则会抛出错误。此时间范围可在 sql server 和 ADO.net 中配置。

这完全取决于你是否想要并发访问。

Read more about ISOLATION Level in DB

【讨论】:

  • 我只特别提到了sql server中使用的默认隔离,但是所有数据库引擎的并发执行方法和隔离作用都是相同的。
【解决方案2】:

1) 我认为是的。一个总是比另一个早;没有其他方法可以解决它。所以一个更新会正常工作,另一个会抛出并发异常。

这可能取决于您使用的数据访问方法,可能有一些系统可以更优雅地处理这种情况。但我怀疑有些系统会给两个用户同样的例外情况,而不是你故意建立这种行为。

正如 Adam Houldsworth 所说:这也可能取决于您自己编码的方式。您可以检查是否有多个用户开始编辑同一记录,然后向两者都抛出异常。但我不相信这就是你真正要问的。如果是这样的话;我误解了。

2) 当然这是可能的,但这取决于你在你的应用程序中构建。只需捕获并发异常并刷新用户 B 尝试更新的任何编辑表单。然后他/她可以再试一次。一般来说很明显;我不知道你的具体情况。

【讨论】:

  • 我不同意你对第一点的回答。没有理由总是只发生在一个人身上。
  • 常识说应该,不是吗?我的意思是它可能取决于你如何编码它和确切的 DAL,但这会使整个问题变得沉默。在常规系统中,请求 A 将在请求 B 之前处理(或相反)。我将编辑我的答案以反映这一点。
  • 可能,但正如我继续解释的那样,事情没那么简单。在乐观并发的基本情况下,很可能是的。
  • 确实如此,但我没有看到任何理由不按照最简单的情况进行。 Elisa 提出的问题是宽泛/含糊地回答任何其他方式。简直是太多可能性了。我同意你的看法,情况可能要复杂得多。
  • @Clound 是的,我的问题很广泛/含糊,因为我刚开始并试图在开始摸索隔离级别之前收集有关并发的基本知识:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2016-08-25
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多