悲观与乐观并发(锁定与反馈)

时间:2009-03-18 18:13:37

标签: concurrency locking editing multi-user

我正在使用以下标准构建应用程序:

  • 工作项目:需要由用户通过网络手动处理的项目(简短的一页表格)
  • 多个用户正在使用“工作项”
  • 每个用户都有一个“工作项目”队列
  • 搜索允许用户查看“工作项”并将“工作项”分配到其队列中
  • 用户可以将“工作项目”从其他人的队列中分配给自己

注意:'工作项'只能使用一次。这不是一个维基页面,它更像是一个匹配练习,只能由一个用户执行一次。一旦“工作项目”工作,它就会从系统中消失(除了一些审计/报告),有点像错误跟踪系统

您认为哪个选项更好?你能举出任何支持你观点的主流应用吗?

选项1:

  • 当用户A前往查看或处理“工作项目”时,“工作项目”将被锁定。
  • 当其他用户在用户A打开“工作项”后转到“工作项”时,他们只能看到“工作项”。他们不能写。
  • 锁定在n分钟后到期,此时另一个用户可以锁定“工作项目”。

选项2:

  • 任何用户都可以在不锁定的情况下提取“工作项”。
  • 如果用户A通过提交表单来处理“工作项目”而用户B使用相同的“工作项”,则用户A的工作将在数据库中生效,并且将通知用户B他们的更改未采取因为另一个用户修改了“工作项”而受到影响。

我个人喜欢选项2.请问好吗?

3 个答案:

答案 0 :(得分:7)

听起来你在谈论pessimistic经文optimistic并发控制。

两者都被广泛使用,我个人认为乐观并发更易于处理,但这将取决于您自己的要求和用法。如果编辑(和潜在冲突)很常见,那么悲观并发控制可能是合适的,如果没有,那么乐观并发将更快更简单地使用。

如果您想在SQL Server中查看使用RowVersion数据类型的代码示例(这就是我目前使用的),请告诉我,但它非常简单:

  • 所有表格都包含RowVersion列
  • 所有SELECT查询都包含此列(对于可以修改的数据)
  • 所有UPDATE或DELETE查询都包含WHERE RowVersion = @RowVersion。这是乐观的部分,如果0行返回然后其他人触摸了行,则不会发生更新,因此请告诉用户。注意:如果行已更新,则还应返回RowVersion的新值。这也适用于INSERT查询,就像在插入后返回标识列的Id一样。

答案 1 :(得分:0)

  

不确定如何描述表单   简单的术语,但它不是一个社区   页面,它是一次性的事情。   假设,假设用户有   将John DOEE这个名字与其中一个相匹配   以下John Doe Jon Do Once   它有效,编辑完成。在   我们的情况,我们不需要仅仅

考虑到这个评论,我会选择选项1.考虑到这些更改是一次性更改,允许多个人处理相同的更改没有任何好处。你只是在浪费第二个人的时间。

答案 2 :(得分:-1)

我个人会使用选项2 - 加上,如果适用(例如那些编辑是在较长的文本上),则由用户B负责合并编辑。给B一个工具。