Was ist eine bewährte Vorgehensweise bei Aktualisierungsabfragen für große Datenmengen, um Sperrwartezeitüberschreitungen zu vermeiden?
P粉842215006
P粉842215006 2024-03-29 10:03:38
0
1
404

Im Grunde habe ich derzeit folgende Frage:

UPDATE act AS a
INNER JOIN blok AS b
ON b.fav_pat = a.pat_id
SET a.blok_id = b.id

Derzeit ist aufgrund der großen Datenmenge, die ich habe, eine Zeitüberschreitung aufgetreten. Gibt es eine Möglichkeit, Zeitüberschreitungen zu vermeiden, ohne die Datenbankkonfiguration zu ändern?

P粉842215006
P粉842215006

Antworte allen(1)
P粉675258598

您使用的 软件包效果最好允许使用主机 RDBMS 的事务语义完全回滚任何不完整的操作。这意味着它被设计为执行更新操作,就像您在符合 ACID 的单个事务中向我们展示的操作一样。

如果涉及的表很大(数百万行或更多),则事务可能会非常大。它们可能会使您的 MySQL 服务器崩溃,将事务日志溢出到磁盘或 SSD。提交这些事务日志可能需要很长时间。您没有提到行数,但如果行数很大,则 Flyway 可能不是适合这项工作的工具。

您的锁定超时暗示您正在对具有其他并发活动的数据库执行此操作。您可能希望在安静的数据库上执行此操作以获得最佳结果。

您可以通过这样做来增加锁定等待超时。

show variables like 'innodb_lock_wait_timeout'; -- previous vale
SET GLOBAL innodb_lock_wait_timeout = 300; -- five min

然后,也许在假期日出之前或其他安静的时间再试一次。更多信息此处

当您的 Flyway 作业完成时,请考虑将锁定超时恢复到之前的值。

您还可以考虑批量更新,例如一次更新 1000 行。但flyway似乎不支持这一点。如果您走这条路,您可以问另一个问题。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage