【问题标题】:Mysql and java : How to handle multiple users when it comes down to concurrent updatesMysql 和 java:当涉及到并发更新时如何处理多个用户
【发布时间】:2020-02-06 14:09:57
【问题描述】:

我用我知道的术语到处寻找,但没有找到任何好的解决方案。我正在尝试做一个基本上做簿记的小应用程序。我使用 java 作为前端,使用 MySQL 作为数据库。

应用程序必须支持多个用户 (3-4),因此如果两个用户想要编辑同一行,我想实施某种保护。

我研究过的东西以及我不知道是否应该使用它们的原因:

  • 休眠:我看到多个线程说 ORM 正在使事情变得复杂
  • 乐观/悲观锁定:使用休眠或 SELECT ... FOR UPDATE 我读过的不利于并发

我不知道还要看什么。

感谢您的阅读

【问题讨论】:

  • 也许this 可以作为参考?当您执行 UPDATE 语句时,似乎排他锁会自动放置在 MySQL 中。
  • 我读过它,它在 MySQL 方面很好,但用户仍然可以同时编辑同一行,因此他们只会覆盖他们的编辑,因为他们不知道有人在已经在编辑。我没听错吗?
  • 我相信吗?老实说,我在 MySQL 方面没有并发方面的经验,但想做一些研究来帮助你。
  • 还是谢谢你,我不知道隐式锁。

标签: java mysql orm locking


【解决方案1】:

您可以从您的应用程序中实现某种锁定数据库中的行,例如添加一列“lockedby”,并将客户端的标识符作为值。在您的应用程序中,在您授予编辑您检查该标志的行的访问权限之前。如果程序仍处于编辑模式,则应用程序应重新获取锁,因此如果客户端失败,该行不会永远保持锁定状态。只是一个想法,但我认为这是一个可能的解决方案。

另一种方法是在提交更新之前检查该行是否已更改。可以通过检查内容的哈希值轻松实现。

【讨论】:

  • 如果我理解正确你提到的客户是用户?如果是这样,我应该在用户尝试修改行时将用户的 id 添加到新列中,如果成功,我可以重置插入新列中的值吗?此外,如果是同一用户,如果新列中是他的 id,他可以重新获取锁吗?
  • 我希望你有一个用户用来获取和修改数据库数据的客户端。如果他们都直接在数据库上工作,这意味着您没有可以编写逻辑的特殊客户端,那么这种方法是不合适的。
  • 哦,客户端作为用户的软件?是的,就是这样的场景。我只是说他们在连接到软件时得到了一个会话,这意味着我可以将用户的 ID 存储在锁定列中。
  • 是的,我认为这将是一个很好的标识符。我可能会存储两个字段。一个用于锁定行的用户的 ID,另一个用于时间戳。例如五分钟左右后,外观将“过期”,这意味着当时字段仍然存在但已过时,因此另一个用户的软件客户端知道,它可以将锁交给其他人。如果一个客户端挂起,这将是“失败”的情况。通常你会在完成后将锁归还。
  • 不客气。希望能帮助到你。祝你的解决方案好运。
猜你喜欢
  • 2012-06-16
  • 2018-04-27
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多