MySQL -- 事务锁 Lock wait timeout exceeded

问题现象

测试ddos持续攻击,防护程序频繁读写数据库,mysql处理报错。同时进行接口调用,接口响应时间较长,耗时几十秒才返回错误提示,两者错误日志均为 Error 1205: Lock wait timeout exceeded; try restarting transaction

 

问题原因

查询官方手册:官方错误文档地址  中文错误文档地址

Error number: 1205; Symbol: ER_LOCK_WAIT_TIMEOUT; SQLSTATE: HY000

Message: Lock wait timeout exceeded; try restarting transaction

InnoDB reports this error when lock wait timeout expires. The statement that waited too long was rolled back (not the entire transaction). You can increase the value of the innodb_lock_wait_timeout configuration option if SQL statements should wait longer for other transactions to complete, or decrease it if too many long-running transactions are causing locking problems and reducing concurrency on a busy system.

翻译:

当锁等待超时后innodb引擎报此错误,等待时间过长的语句被回滚(不是整个事务)。如果想让SQL语句等待其他事务更长时间之后完成,你可以增加参数innodb_lock_wait_timeout配置的值。如果有太多长时间运行的有锁的事务,你可以减小这个innodb_lock_wait_timeout的值,在特别繁忙的系统,你可以减小并发。


Mysql数据库采用InnoDB引擎,InnoDB事务等待一个行级锁的时间最长时间(单位是秒),超过这个时间就会放弃。默认值是50秒。一个事务A试图访问一行数据,但是这行数据正在被另一个innodb事务B锁定,此时事务A就会等待事务B释放锁,等待超过innodb_lock_wait_timeout设置的值就会报错ERROR 1205 (HY000)。 附:查看行锁阈值

 

 

问题场景

  1. 在同一事务内先后对同一条数据进行插入和更新操作;
  2. 多台服务器操作同一数据库;
  3. 瞬时出现高并发现象;(不同事务同时插入更新同一条数据)

 

解决方法

一 :可以尝试修改 innodb_lock_wait_timeout 值(1-1073741824秒) 

mysql> set GLOBAL innodb_lock_wait_timeout=1500;

关于set innodb_lock_wait_timeout=1500; 和 set global innodb_lock_wait_timeout=1500;的区别。前者等价于set session只影响当前session,后者作为全局的修改方式,只会影响修改之后打开的session;注意后者不能改变当前session;
 

二:根据数据库当前状态排除错误

1. 查看数据库当前的进程,看一下有无正在执行的慢SQL记录线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值