Mysql 和 java:当涉及到并发更新时如何处理多个用户

Posted

技术标签:

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

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

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

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

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

我不知道还要看什么。

感谢您的阅读

【问题讨论】:

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

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

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

【讨论】:

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

以上是关于Mysql 和 java:当涉及到并发更新时如何处理多个用户的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 并发更新

分布式-技术专区-Redis和MySQL缓存一致性问题

多线程如何并发访问SQLite数据库

精通Java事务编程-弱隔离级别之防止更新丢失

单进程单线程的Redis如何能够高并发

Java / MySQL:插入记录的问题