mysql事物锁等待超时,报错 Lock wait timeout exceeded; try restarting transaction
2016-12-25 00:00
791 查看
问题场景
问题出现环境:1、在同一事务内先后对同一条数据进行插入和更新操作;
2、多台服务器操作同一数据库;
异常信息:
_mysql_exceptions.OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')
原因分析
在高并发的情况下造成数据库死锁,后续操作超时抛出异常。Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。
解决方案
1、通过下面语句查找到为提交事务的数据,kill掉此线程即可。select * from information_schema.innodb_trx
2、增加锁等待时间,即增大下面配置项参数值,单位为秒(s)
innodb_lock_wait_timeout=500
3、优化存储过程,事务避免过长时间的等待。
扩展阅读:
在InnoDB Plugin之前,一般通过show full processlist(很难发现被锁的行记录问题所在)和show engine innodb status命令查看当前的数据库请求,然后再判断当前事务中锁的情况。随着mysql的发展,已经提供更加便捷的方法来监控数据库中的锁等待现象了。在information_schema下面有三张表:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS(解决问题方法),通过这三张表,可以更简单地监控当前的事务并分析可能存在的问题。
比较常用的列:
trx_id:InnoDB存储引擎内部唯一的事物ID
trx_status:当前事务的状态
trx_status:事务的开始时间
trx_requested_lock_id:等待事务的锁ID
trx_wait_started:事务等待的开始时间
trx_weight:事务的权重,反应一个事务修改和锁定的行数,当发现死锁需要回滚时,权重越小的值被回滚
trx_mysql_thread_id:MySQL中的进程ID,与show processlist中的ID值相对应
trx_query:事务运行的SQL语句
例如工作中遇到了一条表记录,select * from car for update 或者是修改某个字段的值,就报错:Lock wait timeout exceeded; try restarting transaction
解决方法是直接查询上面说的三个表,然后kill 进程ID; 另外从根本上从业务逻辑代码优化对数据库的操作,之前也遇到过此类情况,比如刚刚修改完这条记录,接着再次修改,也会报此错误,从代码和业务层面尽量避免开来。
相关文章推荐
- Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
- Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
- Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
- Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
- Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
- Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决
- mysql因为锁等待导致导入用户失败(Lock wait timeout exceeded; try restarting transaction)
- mysql : Lock wait timeout exceeded; try restarting transaction
- mysql : Lock wait timeout exceeded; try restarting transaction - freeliver54 - 博客园
- mysql报Lock wait timeout exceeded; try restarting transaction
- mysql的gap锁导致Lock wait timeout exceeded try restarting transaction异常
- mysql: Lock wait timeout exceeded; try restarting transaction
- mysql错误:Lock wait timeout exceeded; try restarting transaction解决方案
- MySQL锁;Lock wait timeout exceeded; try restarting transaction
- mysql : Lock wait timeout exceeded; try restarting transaction
- MYSQL:Lock wait timeout exceeded; try restarting transaction ;ERROR 1205
- mysql trouble shooting---- 从库停止同步lock_wait_timeout_exceeded_try_restarting_transaction
- mysql trouble shooting---- 从库停止同步lock_wait_timeout_exceeded_try_restarting_transaction