gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:05:42 25 4
gpt4 key购买 nike

我正在构建具有以下条件的应用程序:

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

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

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

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

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

  • 我个人喜欢选项 2。请考虑一下?

    最佳答案

    听起来你在谈论 pessimistic诗句 optimistic并发控制。

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

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

  • 所有表都包含 RowVersion 列
  • 所有 SELECT 查询都包含此列(用于可修改的数据)
  • 所有 UPDATE 或 DELETE 查询都包含 WHERE RowVersion = @RowVersion。这是乐观的部分,如果返回 0 行,那么其他人已经触及了该行,则不会发生更新,因此请告诉用户。注意:如果行已更新,则还应返回 RowVersion 的新值。这也适用于 INSERT 查询,就像您在插入后返回标识列的 Id 一样。
  • 关于concurrency - 悲观与乐观并发(锁定与反馈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/659489/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com