MySQL锁等待超时和死锁错误

时间:2015-07-02 13:22:56

标签: mysql hibernate jpa timeoutexception

我正在开发一个移动应用程序,其后端是用Java开发的,数据库是MySQL。

我们在数据库表中有一些插入和更新操作,有很多行(介于400.000和3.000.000之间)。每个操作通常都不需要触摸表格的每个寄存器,但也许同时调用它们来更新其中的20%。

有时我会遇到这个错误:

Deadlock found when trying to get lock; try restarting transaction

Lock wait timeout exceeded; try restarting transaction

我已经改进了我的查询,使它们变得更小更快但是当某些操作无法执行时我仍然有一个大问题。

我的解决方案到现在为止:

  • 提高服务器性能(AWS实例从m2.large到c3.2xlarge)
  • SET GLOBAL tx_isolation = 'READ-COMMITTED';
  • 避免检查外键:SET FOREIGN_KEY_CHECKS = 0;我知道这不安全,但我的嗜好不是锁定数据库
  • 为超时变量(SHOW VARIABLES LIKE '%timeout%';)设置此值:
    • connect_timeout:10
    • delayed_insert_timeout:300
    • innodb_lock_wait_timeout:50
    • innodb_rollback_on_timeout:关闭
    • interactive_timeout:28800
    • lock_wait_timeout:31536000
    • net_read_timeout:30
    • net_write_timeout:60
    • slave_net_timeout:3600
    • wait_timeout:28800

但我不确定这些事情是否会降低性能。

有关如何减少这些错误的想法吗?

注意:这些其他人的答案不能帮助我:

MySQL Lock wait timeout exceeded

MySQL: "lock wait timeout exceeded"

How can I change the default Mysql connection timeout when connecting through python?

2 个答案:

答案 0 :(得分:0)

尝试每单个事务更新更少的行。

而不是在单个事务中更新20%或行更新1%的行20次。

这将显着改善您的表现,您将避免超时。

注意:ORM不是大更新的好方法。最好使用标准JDBC。每次使用ORM检索,更新,删除少量记录。它加快了编码阶段,而不是执行时间。

答案 1 :(得分:0)

作为评论而非答案,如果您处于开发的早期阶段,您可能希望考虑您是否确实需要在关系数据库中使用此特定数据。根据计划的数据使用情况,存储来自移动应用程序的数据的速度更快,更大。 [大型文件的S3,存储一次,经常读取(可以缓存); NoSQL(Mongo等)用于非结构化大型,一次写入,多次读取等等。]