gpt4 book ai didi

mysql - 我应该在 MySQL 中使用自定义 'locks' 表吗?

转载 作者:行者123 更新时间:2023-11-29 05:41:44 25 4
gpt4 key购买 nike

我正在开发一个相对简单的自定义 Web 应用程序,后端有一个 MySQL MyISAM 数据库。不知何故,我想避免经典的并发覆盖问题,例如用户 A 覆盖了用户 B 的编辑,因为 B 在 A 完成之前加载并提交了一些编辑表单。

这就是为什么我想以某种方式在显示编辑表单时锁定一行。然而……

  • 正如我所说,我正在使用 MyISAM,据我所知,它不支持行级锁。此外,我不确定是否建议将“真正的”MySQL 锁保持几分钟。
  • 我对事务了解不多,但据我所知,它们似乎应该在一个连接内使用。
  • 使用像 Git 这样的某种冲突合并系统并不是一个真正的选择。

行将保持锁定状态几分钟。并发性非常低:随时有六个用户在使用该应用。

我现在计划使用一个表格来详细说明哪个用户在做什么以及从什么时候开始。然后,该应用程序可以决定在其他用户最近打开它(例如正在处理它)时不显示编辑表单。这个假锁将在保存表单时被删除。

这行得通吗?我应该怎么做才能避免死锁、活锁和所有类似问题?

最佳答案

您可以实现锁定,最简单的方法可能是向要锁定的数据添加两个字段(lock_created Datetime、locked_by int)。然后在编辑页面上(也可能在编辑按钮上)检查是否 (lock_created + lock_interval) < now() - 如果不是,数据将被锁定以进行编辑,并且应该通知用户。 (请注意,您始终需要在编辑页面上进行检查,而不仅仅是在编辑按钮上进行检查。)同样在提交页面上,您需要检查用户是否仍然拥有提交锁。 (见下文。)

其中一个困难的部分是当有人编辑但未能在锁定间隔内提交时该怎么办。所以:

  1. lock_interval 是 2 分钟。
  2. 在时间 0:00 Alice 锁定了页面,编辑了一些东西,但是接到了一个电话并且没有提交她的更改
  3. 在时间 2:30 Bob 检查页面,因为 Alice 的锁已过期而获得编辑锁,然后进行编辑
  4. 在 3:00 时,Alice 回到她的 comp,按下提交 -> 冲突。

有人没有提交他们的数据。如果您将锁设置为过期,则没有办法解决这个问题。 (如果你不这样做,锁可以永远留下。)您只能决定优先考虑哪一个(使用 Bob 创建的新锁可能是最简单的)并通知另一个页面已过期并且不会提交数据,然后将他们的编辑交还给他们以重做。

关于表结构的注意事项:您可以创建一个包含字段“table_name、row_id、lock_created、locked_by”的表“locks”,但这可能不是最简单的方法,因为连接可变表名是复杂且令人困惑的.此外,将所有锁存储在一个地方可能没有用。对于一个简单的机制,我认为向每个要实现锁定机制的表添加统一字段更容易。

关于mysql - 我应该在 MySQL 中使用自定义 'locks' 表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6321455/

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