「 Lock wait timeout exceeded; try restarting transaction 」
` 还是前段时间的那个老项目 : 客户要给服务器系统升级,当时的服务器部署手册, 以及宕机处理方案也在里面,于是客户的IT部门自己重启了相关服务后,发现操作部分功能时发现锁表了, 于是勇敢的小齐又被老板安排了 经过排查发现实际上是因为操作不规范,导致多启动了一个sleuth服务,但是这个服务,项目不需要 出现了数据库锁表,就下面这张图 后面赶紧通知对方IT部门停掉sleuth容器 下面就是处理锁表问题的步骤 `
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
innodb_trx
`trx_id` varchar(18) NOT NULL DEFAULT '', #事务ID `trx_state` varchar(13) NOT NULL DEFAULT '',`#事务状态 `trx_started` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', #事务开始时间 `trx_requested_lock_id` varchar(81) DEFAULT NULL, #innodb_locks.lock_id `trx_wait_started` datetime DEFAULT NULL, #事务开始等待的时间 `trx_weight` bigint(21) unsigned NOT NULL DEFAULT '0', `trx_mysql_thread_id` bigint(21) unsigned NOT NULL DEFAULT '0', #事务线程ID `trx_query` varchar(1024) DEFAULT NULL, #具体SQL语句 `trx_operation_state` varchar(64) DEFAULT NULL, #事务当前操作状态 `trx_tables_in_use` bigint(21) unsigned NOT NULL DEFAULT '0',#事务中有多少个表被使用 `trx_tables_locked` bigint(21) unsigned NOT NULL DEFAULT '0', #事务拥有多少个锁 `trx_lock_structs` bigint(21) unsigned NOT NULL DEFAULT '0', `trx_lock_memory_bytes` bigint(21) unsigned NOT NULL DEFAULT '0',#事务锁住的内存大小(B) `trx_rows_locked` bigint(21) unsigned NOT NULL DEFAULT '0',#事务锁住的行数 `trx_rows_modified` bigint(21) unsigned NOT NULL DEFAULT '0',#事务更改的行数 `trx_concurrency_tickets` bigint(21) unsigned NOT NULL DEFAULT '0',#事务并发票数 `trx_isolation_level` varchar(16) NOT NULL DEFAULT '',#事务隔离级别 `trx_unique_checks` int(1) NOT NULL DEFAULT '0',#是否唯一性检查 `trx_foreign_key_checks` int(1) NOT NULL DEFAULT '0',#是否外键检查 `trx_last_foreign_key_error` varchar(256) DEFAULT NULL,#最后的外键错误 `trx_adaptive_hash_latched` int(1) NOT NULL DEFAULT '0', `trx_adaptive_hash_timeout` bigint(21) unsigned NOT NULL DEFAULT '0', `trx_is_read_only` int(1) NOT NULL DEFAULT '0', `trx_autocommit_non_locking` int(1) NOT NULL DEFAULT '0'
innodb_locks
`lock_id` varchar(81) NOT NULL DEFAULT '',#锁ID `lock_trx_id` varchar(18) NOT NULL DEFAULT '',#拥有锁的事务ID `lock_mode` varchar(32) NOT NULL DEFAULT '',#锁模式 `lock_type` varchar(32) NOT NULL DEFAULT '',#锁类型 `lock_table` varchar(1024) NOT NULL DEFAULT '',#被锁的表 `lock_index` varchar(1024) DEFAULT NULL,#被锁的索引 `lock_space` bigint(21) unsigned DEFAULT NULL,#被锁的表空间号 `lock_page` bigint(21) unsigned DEFAULT NULL,#被锁的页号 `lock_rec` bigint(21) unsigned DEFAULT NULL,#被锁的记录号 `lock_data` varchar(8192) DEFAULT NULL #被锁的数据
innodb_lock_waits
`requesting_trx_id` varchar(18) NOT NULL DEFAULT '',#请求锁的事务ID `requested_lock_id` varchar(81) NOT NULL DEFAULT '',#请求锁的锁ID `blocking_trx_id` varchar(18) NOT NULL DEFAULT '',#当前拥有锁的事务ID `blocking_lock_id` varchar(81) NOT NULL DEFAULT ''#当前拥有锁的锁ID
select * from INNODB_TRX ; select * from innodb_lock_waits ; select * from INNODB_LOCKS ; kill 进程号 上面的进程号指的是:innodb_trx表的trx_mysql_thread_id字段的值
至此问题解决
分享一句我特别喜欢的话:每一天都是一个新的日子,走运当然是好的,不过我情愿做到分毫不差。这样,运气来的时候,你就有准备了。 ————海明威《老人与海》