MySQL一次死锁问题解决记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/diaomeng11/article/details/77962948

一个管理后台的管理员提出一个修改功能异常的问题,追踪发现数据修改出现了异常

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:259)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
    at com.sun.proxy.$Proxy19.update(Unknown Source)

............

初步判断是出现了锁等待,去数据库查看,发现对应的那一条记录大部分字段是可以更改的!只有一个关键的字段不能更改!

这个时候还不太了解mysql的各种锁,使用 SHOW PROCESSLIST 和 SHOW ENGINE INNODB STATUS 也并没有找到问题

通过查找资料,找到了解决办法 SELECT * FROM information_schema.innodb_trx

查找到一条一天之前开始但一直未提交的事务

`trx_id`, `trx_state`, `trx_started`, `trx_requested_lock_id`, `trx_wait_started`, `trx_weight`, `trx_mysql_thread_id`, `trx_query`, `trx_operation_state`, `trx_tables_in_use`, `trx_tables_locked`, `trx_lock_structs`, `trx_lock_memory_bytes`, `trx_rows_locked`, `trx_rows_modified`, `trx_concurrency_tickets`, `trx_isolation_level`, `trx_unique_checks`, `trx_foreign_key_checks`, `trx_last_foreign_key_error`, `trx_adaptive_hash_latched`, `trx_adaptive_hash_timeout`, `trx_is_read_only`, `trx_autocommit_non_locking`
'1231918001','RUNNING','2017-09-12 20:05:17',NULL,NULL,'10','637994104',NULL,NULL,'0','0','7','1184','17','3','0','READ COMMITTED','1','1',NULL,'0','10000','0','0');
一条很奇怪的记录。没有sql语句。通过trx_mysql_thread_id 去SHOW PROCESSLIST中找到对应的记录,发现这个线程是sleep状态

kill掉之后,回复正常。

查找分析,个人认为是因为gap锁导致的死锁问题,恰好本次涉及到的问题字段是索引字段。


下面这篇文章对本次问题已经MySQL的理解有很大的帮助

https://tech.meituan.com/innodb-lock.html

猜你喜欢

转载自blog.csdn.net/diaomeng11/article/details/77962948