我正在开发一个移动应用程序,其后端使用Java开发,数据库为MySQL。
我们在具有大量行(介于400,000和3,000,000之间)的数据库表中进行了一些插入和更新操作。每个操作通常不需要触及表中的每个记录,但是可能会同时调用它们以更新其中的20%。
有时候我会遇到以下错误:
“尝试获取锁定时发现死锁;请尝试重新启动事务”
以及
“锁等待超时;请尝试重新启动事务”
我已经改进了我的查询,使它们更小更快,但是当某些操作无法执行时,我仍然面临一个大问题。
到目前为止,我的解决方案是:
我们在具有大量行(介于400,000和3,000,000之间)的数据库表中进行了一些插入和更新操作。每个操作通常不需要触及表中的每个记录,但是可能会同时调用它们以更新其中的20%。
有时候我会遇到以下错误:
“尝试获取锁定时发现死锁;请尝试重新启动事务”
以及
“锁等待超时;请尝试重新启动事务”
我已经改进了我的查询,使它们更小更快,但是当某些操作无法执行时,我仍然面临一个大问题。
到目前为止,我的解决方案是:
- 提高服务器性能(将AWS实例从m2.large升级到c3.2xlarge)
SET GLOBAL tx_isolation = 'READ-COMMITTED';
- 避免检查外键:
SET FOREIGN_KEY_CHECKS = 0;
(我知道这不安全,但我的优先级不是锁定数据库) - 为超时变量设置以下值(
SHOW VARIABLES LIKE '%timeout%';
):connect_timeout
:10delayed_insert_timeout
:300innodb_lock_wait_timeout
:50innodb_rollback_on_timeout
:OFFinteractive_timeout
:28800lock_wait_timeout
:31536000net_read_timeout
:30net_write_timeout
:60slave_net_timeout
:3600wait_timeout
:28800
但我不确定这些事情是否降低了性能。
有什么办法可以减少这些错误吗?
注:以下其他SO答案对我没有帮助: