我的数据库表上的并发更新问题

时间:2019-06-27 14:47:46

标签: mysql database

不同的微服务可能同时在数据库表上执行以下命令

> update table_2 set final_date='23123123' where section_id=10  

section_id可能有5万行。如果多个连接执行相同的命令(和相同的值),可能会出什么问题?如何预防潜在的问题?

2 个答案:

答案 0 :(得分:0)

如果命令将多次执行,这将使您头痛,因为您将无法获得所需的东西。因此,请先确定逻辑,然后再正确应用它,例如,您可以决定仅采取第一个到达的更改,而在捕获其他更改后将其丢弃(您可以给出一条信息,例如``记录锁定无法修改!'')

答案 1 :(得分:0)

首先,您的应用程序中不会出现任何“错误”。 (除非您以某种方式超出了数据库或应用程序允许的最大连接数)数据库本身将处理不允许多个连接在“同一时间”“更新”同一行的问题。除非您在SQL语句中明确声明,否则默认的锁定机制将强制您多次尝试将同一行更新为一个队列。

现在,您担心的是数据完整性。如果只是让数据库管理多个请求来提供合适的结果,则确定什么是问题,什么是ISN,尝试修复您的应用程序层以防止多个节点同时触发同一请求可能是不值得的时间和麻烦。 。

我提供了几种解决方案,可以减少执行的UPDATES数量,但不会减少应用程序将使用的连接数。

为UPDATE语句添加更多逻辑-例如仅在最终日期的现有值超过5秒(或5分钟或5小时,如果适合您的用例)时才更新。该值不必太大,因为如果应用程序节点同时请求这些语句,它们将很快执行。

AND / OR结帐“跳过锁定”在这里: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

它实际上将接受第一个节点的请求,然后所有其他尝试更新的对象只要在行锁定时尝试更新就停止。这可以代替上面的逻辑,但仅适用于在行已被先前的UPDATE锁定时发生的请求。