设为首页 收藏本站
查看: 1097|回复: 0

[经验分享] mysql-解锁-SQLException: Lock wait timeout exceeded

[复制链接]

尚未签到

发表于 2018-10-11 06:14:29 | 显示全部楼层 |阅读模式
  java.lang.Exception:
  ### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
  ### The error may involve defaultParameterMap
  ### The error occurred while setting parameters
  ### Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
  ; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
  select * from information_schema.innodb_trx 之后找到了一个一直没有提交的只读事务,
  kill 到了对应的线程后ok 了。
  ==============================================
  select version();-查看当前mysql版本号
MySQL 5.5 -- innodb_lock_wait 锁 等待
  记得以前,当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,
  要解决是一件麻烦的事情 ;
  特别是当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时结束;
  DBA光从数据库无法着手找出源头是哪个SQL锁住了;
  有时候看看show engine innodb status , 并结合 show full processlist; 能暂时解决问题;但一直不能精确定位;
  在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎);
  innodb_trx ## 当前运行的所有事务
  innodb_locks ## 当前出现的锁
  innodb_lock_waits ## 锁等待的对应关系
  看到这个就非常激动 ; 这可是解决了一个大麻烦,先来看一下表结构
  root@127.0.0.1  : information_schema 13:28:38> desc innodb_locks;
  +-------------+---------------------+------+-----+---------+-------+
  | Field | Type | Null | Key | Default | Extra |
  +-------------+---------------------+------+-----+---------+-------+
  | lock_id | varchar(81) | NO | | | |#锁ID
  | lock_trx_id | varchar(18) | NO | | | |#拥有锁的事务ID
  | lock_mode | varchar(32) | NO | | | |#锁模式
  | lock_type | varchar(32) | NO | | | |#锁类型
  | lock_table | varchar(1024) | NO | | | |#被锁的表
  | lock_index | varchar(1024) | YES | | NULL | |#被锁的索引
  | lock_space | bigint(21) unsigned | YES | | NULL | |#被锁的表空间号
  | lock_page | bigint(21) unsigned | YES | | NULL | |#被锁的页号
  | lock_rec | bigint(21) unsigned | YES | | NULL | |#被锁的记录号
  | lock_data | varchar(8192) | YES | | NULL | |#被锁的数据
  +-------------+---------------------+------+-----+---------+-------+
  10 rows in set (0.00 sec)
  root@127.0.0.1  : information_schema 13:28:56> desc innodb_lock_waits;
  +-------------------+-------------+------+-----+---------+-------+
  | Field | Type | Null | Key | Default | Extra |
  +-------------------+-------------+------+-----+---------+-------+
  | requesting_trx_id | varchar(18) | NO | | | |#请求锁的事务ID
  | requested_lock_id | varchar(81) | NO | | | |#请求锁的锁ID
  | blocking_trx_id | varchar(18) | NO | | | |#当前拥有锁的事务ID
  | blocking_lock_id | varchar(81) | NO | | | |#当前拥有锁的锁ID
  +-------------------+-------------+------+-----+---------+-------+
  4 rows in set (0.00 sec)
  root@127.0.0.1  : information_schema 13:29:05> desc innodb_trx ;
  +----------------------------+---------------------+------+-----+---------------------+-------+
  | Field | Type | Null | Key | Default | Extra |
  +----------------------------+---------------------+------+-----+---------------------+-------+
  | trx_id | varchar(18) | NO | | | |#事务ID
  | trx_state | varchar(13) | NO | | | |#事务状态:
  | trx_started | datetime | NO | | 0000-00-00 00:00:00 | |#事务开始时间;
  | trx_requested_lock_id | varchar(81) | YES | | NULL | |#innodb_locks.lock_id
  | trx_wait_started | datetime | YES | | NULL | |#事务开始等待的时间
  | trx_weight | bigint(21) unsigned | NO | | 0 | |#
  | trx_mysql_thread_id | bigint(21) unsigned | NO | | 0 | |#事务线程ID
  | trx_query | varchar(1024) | YES | | NULL | |#具体SQL语句
  | trx_operation_state | varchar(64) | YES | | NULL | |#事务当前操作状态
  | trx_tables_in_use | bigint(21) unsigned | NO | | 0 | |#事务中有多少个表被使用
  | trx_tables_locked | bigint(21) unsigned | NO | | 0 | |#事务拥有多少个锁
  | trx_lock_structs | bigint(21) unsigned | NO | | 0 | |#
  | trx_lock_memory_bytes | bigint(21) unsigned | NO | | 0 | |#事务锁住的内存大小(B)
  | trx_rows_locked | bigint(21) unsigned | NO | | 0 | |#事务锁住的行数
  | trx_rows_modified | bigint(21) unsigned | NO | | 0 | |#事务更改的行数
  | trx_concurrency_tickets | bigint(21) unsigned | NO | | 0 | |#事务并发票数
  | trx_isolation_level | varchar(16) | NO | | | |#事务隔离级别
  | trx_unique_checks | int(1) | NO | | 0 | |#是否唯一性检查
  | trx_foreign_key_checks | int(1) | NO | | 0 | |#是否外键检查
  | trx_last_foreign_key_error | varchar(256) | YES | | NULL | |#最后的外键错误
  | trx_adaptive_hash_latched | int(1) | NO | | 0 | |#
  | trx_adaptive_hash_timeout | bigint(21) unsigned | NO | | 0 | |#
  +----------------------------+---------------------+------+-----+---------------------+-------+
  22 rows in set (0.01 sec)
  下面我们来动手看看数据吧:
  ##建立测试数据:
  use test;
  create table tx1
  (id int primary key ,
  c1 varchar(20),
  c2 varchar(30))
  engine=innodb default charset = utf8 ;
  insert into tx1 values
  (1,'aaaa','aaaaa2'),
  (2,'bbbb','bbbbb2'),
  (3,'cccc','ccccc2');
  commit;
  ###产生事务;
  ### Session1
  start transaction;

  update tx1 set c1='heyf',c2='heyf' where>  ## 产生事务,在innodb_trx就有数据 ;
  root@127.0.0.1  : information_schema 13:38:21> select * from innodb_trx G
  *************************** 1. row ***************************
  trx_id: 3669D82
  trx_state: RUNNING
  trx_started: 2010-12-24 13:38:06
  trx_requested_lock_id: NULL
  trx_wait_started: NULL
  trx_weight: 3
  trx_mysql_thread_id: 2344
  trx_query: NULL
  trx_operation_state: NULL
  trx_tables_in_use: 0
  trx_tables_locked: 0
  trx_lock_structs: 2
  trx_lock_memory_bytes: 376
  trx_rows_locked: 1
  trx_rows_modified: 1
  trx_concurrency_tickets: 0
  trx_isolation_level: REPEATABLE READ
  trx_unique_checks: 1
  trx_foreign_key_checks: 1
  trx_last_foreign_key_error: NULL
  trx_adaptive_hash_latched: 0
  trx_adaptive_hash_timeout: 10000
  1 row in set (0.00 sec)
  ### 由于没有产生锁等待,下面两个表没有数据 ;
  root@127.0.0.1  : information_schema 13:38:31> select * from innodb_lock_waits G
  Empty set (0.00 sec)
  root@127.0.0.1  : information_schema 13:38:57> select * from innodb_locks G
  Empty set (0.00 sec)
  #### 产生锁等待
  #### session 2
  start transaction;

  update tx1 set c1='heyfffff',c2='heyffffff' where>  root@127.0.0.1  : information_schema 13:39:01> select * from innodb_trx G
  *************************** 1. row ***************************
  trx_id: 3669D83 ##第2个事务
  trx_state: LOCK WAIT ## 处于等待状态
  trx_started: 2010-12-24 13:40:07
  trx_requested_lock_id: 3669D83:49:3:4 ##请求的锁ID
  trx_wait_started: 2010-12-24 13:40:07
  trx_weight: 2

  trx_mysql_thread_id: 2346 ##线程>
  trx_query: update tx1 set c1='heyfffff',c2='heyffffff' where>  trx_operation_state: starting index read
  trx_tables_in_use: 1 ##需要用到1个表
  trx_tables_locked: 1 ##有1个表被锁
  trx_lock_structs: 2
  trx_lock_memory_bytes: 376
  trx_rows_locked: 1
  trx_rows_modified: 0
  trx_concurrency_tickets: 0
  trx_isolation_level: REPEATABLE READ
  trx_unique_checks: 1
  trx_foreign_key_checks: 1
  trx_last_foreign_key_error: NULL
  trx_adaptive_hash_latched: 0
  trx_adaptive_hash_timeout: 10000
  *************************** 2. row ***************************
  trx_id: 3669D82 ##第1个事务
  trx_state: RUNNING
  trx_started: 2010-12-24 13:38:06
  trx_requested_lock_id: NULL
  trx_wait_started: NULL
  trx_weight: 3
  trx_mysql_thread_id: 2344
  trx_query: NULL
  trx_operation_state: NULL
  trx_tables_in_use: 0
  trx_tables_locked: 0
  trx_lock_structs: 2
  trx_lock_memory_bytes: 376
  trx_rows_locked: 1
  trx_rows_modified: 1
  trx_concurrency_tickets: 0
  trx_isolation_level: REPEATABLE READ
  trx_unique_checks: 1
  trx_foreign_key_checks: 1
  trx_last_foreign_key_error: NULL
  trx_adaptive_hash_latched: 0
  trx_adaptive_hash_timeout: 10000
  2 rows in set (0.00 sec)
  root@127.0.0.1  : information_schema 13:40:12> select * from innodb_locks G
  *************************** 1. row ***************************
  lock_id: 3669D83:49:3:4 ## 第2个事务需要的锁
  lock_trx_id: 3669D83
  lock_mode: X
  lock_type: RECORD
  lock_table: `test`.`tx1`
  lock_index: `PRIMARY`
  lock_space: 49
  lock_page: 3
  lock_rec: 4
  lock_data: 3
  *************************** 2. row ***************************
  lock_id: 3669D82:49:3:4 ## 第1个事务需要的锁
  lock_trx_id: 3669D82
  lock_mode: X
  lock_type: RECORD
  lock_table: `test`.`tx1`
  lock_index: `PRIMARY`
  lock_space: 49
  lock_page: 3
  lock_rec: 4
  lock_data: 3
  2 rows in set (0.00 sec)
  root@127.0.0.1  : information_schema 13:40:15> select * from innodb_lock_waits G
  *************************** 1. row ***************************
  requesting_trx_id: 3669D83 ## 请求锁的事务
  requested_lock_id: 3669D83:49:3:4 ## 请求锁的锁ID
  blocking_trx_id: 3669D82 ## 拥有锁的事务
  blocking_lock_id: 3669D82:49:3:4 ## 拥有锁的锁ID
  1 row in set (0.00 sec)
  -----------------------------------------
  通过分析:事务3669D82 没提交锁定了表导致3669D83 只能等待,不能提交;
  解决方案是杀掉事务3669D82 对应的线程ID----trx_mysql_thread_id: 2344
  执行sql;       kill 2344;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620064-1-1.html 上篇帖子: RHEL/CentOS 7/6/5 Yum安装 MySQL 5.7.9 下篇帖子: mysql的infomation_schema都有哪些对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表