数据库锁表如何处理:「 Lock wait timeout exceeded; try restarting transaction」

文章目录

数据库锁表「 Lock wait timeout exceeded; try restarting transaction 」

前言

` 还是前段时间的那个老项目 : 客户要给服务器系统升级,当时的服务器部署手册,
以及宕机处理方案也在里面,于是客户的IT部门自己重启了相关服务后,发现操作部分功能时发现锁表了,
于是勇敢的小齐又被老板安排了
经过排查发现实际上是因为操作不规范,导致多启动了一个sleuth服务,但是这个服务,项目不需要
出现了数据库锁表,就下面这张图

后面赶紧通知对方IT部门停掉sleuth容器

下面就是处理锁表问题的步骤
`

操作数据库的时候发现,锁表了

数据库锁表如何处理:「 Lock wait timeout exceeded; try restarting transaction」

information_schema 库中有三个关于锁的表(存储引擎)

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字段的值

至此问题解决

分享一句我特别喜欢的话:每一天都是一个新的日子,走运当然是好的,不过我情愿做到分毫不差。这样,运气来的时候,你就有准备了。 ————海明威《老人与海》

上一篇:LeetCode 每日一题 2021/5/24-2021/5/30


下一篇:5-23对象