如何通过避免死锁来同步 mysql 中的两个 table?
How to sync two table in mysql by avoiding deadlocks?
我正在使用 my-sql 作为驱动程序的 AWS-Aurora 中的 2 个表工作。
让我们将两个表称为 Table A 和 Table B.
- Table B 是我的主要来源。
- Table A 大部分不同步
Table B.
所以,我开始更新我的 Table A,使用左连接 Table B。
我在 cron 作业中开始 运行 我的更新语句。在我知道更新正在创建阻碍我的完整数据管道的死锁之前,一切都很顺利。
我正在寻找同步我的 Table A:
的解决方案
- 我可以在哪里避免 Table A.
上的死锁
- 此外,我想避免对数据管道进行任何更改。
死锁是由两个或多个事务同时引起的运行。
事实是,您可以做很多事情来减少死锁,但在实际意义上有很多不同类型的 activity,完全消除死锁通常是不可能的。
处理死锁的唯一方法是重试任何因死锁而失败的事务。
现在,如果您的更新导致现有应用程序中的事务回滚并且您不想更改它,最好的办法是将每个语句中更新的行数保持在最低限度。如果您一次更新一行,则不太可能。当然,那是很慢的。
现在,您可以使用 lock table
在 运行 您的 cron 之前锁定 table。这将导致其他一切等待并可能导致性能问题,但它会起作用。
您可以执行 select ... for update
来锁定您计划更新的行。但我怀疑您正在尝试同时执行所有行,因此无论如何您都会有效地锁定整个 table。
我正在使用 my-sql 作为驱动程序的 AWS-Aurora 中的 2 个表工作。 让我们将两个表称为 Table A 和 Table B.
- Table B 是我的主要来源。
- Table A 大部分不同步 Table B.
所以,我开始更新我的 Table A,使用左连接 Table B。 我在 cron 作业中开始 运行 我的更新语句。在我知道更新正在创建阻碍我的完整数据管道的死锁之前,一切都很顺利。
我正在寻找同步我的 Table A:
的解决方案- 我可以在哪里避免 Table A. 上的死锁
- 此外,我想避免对数据管道进行任何更改。
死锁是由两个或多个事务同时引起的运行。 事实是,您可以做很多事情来减少死锁,但在实际意义上有很多不同类型的 activity,完全消除死锁通常是不可能的。
处理死锁的唯一方法是重试任何因死锁而失败的事务。
现在,如果您的更新导致现有应用程序中的事务回滚并且您不想更改它,最好的办法是将每个语句中更新的行数保持在最低限度。如果您一次更新一行,则不太可能。当然,那是很慢的。
现在,您可以使用 lock table
在 运行 您的 cron 之前锁定 table。这将导致其他一切等待并可能导致性能问题,但它会起作用。
您可以执行 select ... for update
来锁定您计划更新的行。但我怀疑您正在尝试同时执行所有行,因此无论如何您都会有效地锁定整个 table。