Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库表上的并发更新出现问题_Mysql_Database - Fatal编程技术网

Mysql 数据库表上的并发更新出现问题

Mysql 数据库表上的并发更新出现问题,mysql,database,Mysql,Database,不同的微服务可能同时在我的数据库表上执行以下命令 > update table_2 set final_date='23123123' where section_id=10 节id可能有50K行。如果多个连接执行相同的命令(和相同的值),会出现什么问题?如何预防潜在问题 很明显,如果该命令将执行多次,这将导致您头痛,因为您无法得到想要的。因此,在正确应用之前,请尝试确定逻辑。例如,您可以决定只接受到达的第一个更改,并在捕获其他更改后丢弃它们(您可以给出类似“record locke

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

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

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

很明显,如果该命令将执行多次,这将导致您头痛,因为您无法得到想要的。因此,在正确应用之前,请尝试确定逻辑。例如,您可以决定只接受到达的第一个更改,并在捕获其他更改后丢弃它们(您可以给出类似“record locked can not modified!”的消息).

很明显,如果该命令将执行多次,这将导致您头痛,因为您无法得到想要的。因此,在正确应用之前,请尝试确定逻辑。例如,您可以决定只接受到达的第一个更改,并在捕获其他更改后丢弃它们(您可以给出类似“记录锁定无法修改!”)的消息。

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

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

我提供了几种解决方案,可以减少执行的更新数量,但不会减少应用程序与数据库的连接数量

为UPDATE语句添加更多逻辑-例如,仅当final date的现有值超过5秒(或5分钟或5小时,任何适合您的用例的值)时才进行更新。它不应该是一个大值,因为如果应用程序节点同时请求,这些语句将快速执行

和/或在此处签出“跳过锁定”:

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

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

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

我提供了几种解决方案,可以减少执行的更新数量,但不会减少应用程序与数据库的连接数量

为UPDATE语句添加更多逻辑-例如,仅当final date的现有值超过5秒(或5分钟或5小时,任何适合您的用例的值)时才进行更新。它不应该是一个大值,因为如果应用程序节点同时请求,这些语句将快速执行

和/或在此处签出“跳过锁定”:


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

您应该通过同步应用程序中的各个节点来避免这种情况,这样它们就不会尝试去执行相同的逻辑更新。实际上,MySQL数据库是一个可以用来同步应用程序的工具。MySQL如何帮助在POD之间进行同步?您可以创建一个只包含一行的表。任何尝试执行更新的应用程序(它们都可能…假设每个节点中都存在相同的逻辑触发器),它首先尝试获取此行的锁。当然,只有一个节点可以获得锁,并且只有在可以获得锁的情况下,应用程序才会尝试更新。MySQL负责这类事情,您使用的MySQL不访问它是正确的选择DBMS@RiggsFolly第一个将更新表(将发生锁定)。但是,在第一个微服务结束作业后,其余线程将尝试执行相同的更新。您应该通过同步应用程序中的各个节点来避免这种情况,这样它们就不会尝试执行相同的逻辑更新。实际上,MySQL数据库是一个可以用来同步应用程序的工具。MySQL如何帮助在POD之间进行同步?您可以创建一个只包含一行的表。任何尝试执行更新的应用程序(它们都可能…假设每个节点中都存在相同的逻辑触发器),它首先尝试获取此行的锁。当然,只有一个节点可以获得锁,并且只有在可以获得锁的情况下,应用程序才会尝试更新。MySQL负责这类事情,您使用的MySQL不访问它是正确的选择DBMS@RiggsFolly第一个将更新表(将发生锁定)。但是,在第一次微服务更新之后,其余线程将尝试执行相同的更新