乐观并发-没问题吗?

问题描述

我已经阅读了这篇文章 [1]:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/optimistic-concurrency

本文介绍了针对许多用户可以写入同一数据库的情况的下一个解决方案。

您作为用户需要:

  1. 检索该行以及该行的最后修改的dateTime。
  2. 进行所需的计算,但不向数据库写入任何内容。
  3. 计算之后,在您要将结果写入数据库之前, 再次检索同一行的最后修改日期时间。
  4. 比较#1的日期时间和#2的dateTime。 如果它们相等-一切正常,则提交,并将当前时间写为该行的最后修改日期时间。 其他-其他用户在这里-回滚。

这个过程看起来很合理,但是我看到了下一个漏洞: 在#3中,用户检索该行的最后修改的dateTime,但是如果在读取此dateTime(在#3中)与写入#4的时间之间,另一个用户进入,写入其数据并退出该怎么办?第一个用户永远不会知道它,它将覆盖第二个用户的数据。

不可能吗?

解决方法

您描述的算法确实有可能在步骤 #3 和 #4 之间丢失并发更新。

关于测试乐观并发违规的部分说:

尝试更新时,数据库中的时间戳值为 与修改后的原始时间戳值相比 排。如果它们匹配,则执行更新并且时间戳列 用当前时间更新以反映更新。如果他们不 匹配,发生乐观并发冲突。

虽然没有明确提到,但这个想法是让比较和更新步骤在服务器上原子地发生。这可以通过包含涉及时间戳及其原始值的 WHERE 子句的 UPDATE 语句来完成。类似于文章中提到的示例,其中一行中的所有原始列值仍然与数据库中找到的值匹配。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...