6

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

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

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

你认为哪个选项更好?你能引用任何支持你观点的主流应用程序吗?

选项1:

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

选项 2:

  • 任何用户都可以在不锁定的情况下拉起“工作项”。
  • 如果用户 A 通过提交表单来处理“工作项”而用户 B 处理相同的“工作项”,则用户 A 的工作将在数据库中生效,并且用户 B 将被告知他们的更改没有生效,因为另一个用户已修改“工作项”。

我个人喜欢选项 2。请问有什么想法吗?

4

3 回答 3

7

听起来你在谈论悲观的诗句乐观的并发控制。

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

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

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

不知道如何用简单的术语来描述表单,但它不是社区页面,它是一次性的。假设,假设用户必须将名称 John DOEE 与以下 John Doe Jon Do 之一匹配。一旦成功,编辑就完成了。在我们的例子中,我们不需要仅仅

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

于 2009-03-18T18:26:21.387 回答
-1

我个人会选择选项 2 - 另外,如果适用(例如,这些编辑在较长的文本上),则用户 B 有责任合并编辑。给 B 一个这样做的工具。

于 2009-03-18T18:17:22.423 回答