zoukankan      html  css  js  c++  java
  • MySQL 锁等待

    对于异常:

    ERROR 1205 (HY000): Lock wait timeoutexceeded; 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 ## 锁等待的对应关系 注意:如果使用select * from table for update时,上面的参数无法看到锁的情况,只有在show engine innodb status能查到。 另外还可以查看参数:

    mysql> show status like 'innodb_row_lock_%';
    +-------------------------------+-----------+
    | Variable_name                 | Value     |
    +-------------------------------+-----------+
    | Innodb_row_lock_current_waits | 2         |
    | Innodb_row_lock_time          | 334377476 |
    | Innodb_row_lock_time_avg      | 50678     |
    | Innodb_row_lock_time_max      | 51974     |
    | Innodb_row_lock_waits         | 6598      |
    +-------------------------------+-----------+
    
    解释如下:
    Innodb_row_lock_current_waits : 当前等待锁的数量
    Innodb_row_lock_time : 系统启动到现在,锁定的总时间长度
    Innodb_row_lock_time_avg : 每次平均锁定的时间
    Innodb_row_lock_time_max : 最长一次锁定时间
    Innodb_row_lock_waits : 系统启动到现在总共锁定的次数
    desc information_schema.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 | |#被锁的数据
    +-------------+---------------------+------+-----+---------+-------+
    desc information_schema.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
    +-------------------+-------------+------+-----+---------+-------+
    desc information_schema.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 ||#
    +----------------------------+---------------------+------+-----+---------------------+-------+
    

    下面我们来动手看看数据吧: 建立测试数据:

    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 id =3 ;
    产生事务,在innodb_trx就有数据 ;
     select * from information_schema.innodb_trxG;
    *************************** 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)
    由于没有产生锁等待,下面两个表没有数据 ;
    select * from information_schema.innodb_lock_waitsG;
    Empty set (0.00 sec)
    root@127.0.0.1 :information_schema 13:38:57> select * frominnodb_locks G
    Empty set (0.00 sec)
    产生锁等待
    session 2:
    start transaction;
    update tx1 set c1='heyfffff',c2='heyffffff' where id =3 ;
    select * from information_schema.innodb_trxG;
    *************************** 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 ##线程 ID
    trx_query: update tx1 set c1='heyfffff',c2='heyffffff' where id=3
    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)
    select * from information_schema.innodb_locksG;
    *************************** 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)
    select * from information_schema.innodb_lock_waitsG;
    *************************** 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)
    
  • 相关阅读:
    基于事件的异步编程
    基于任务的异步编程
    C#异步编程
    C#2.0
    Mac上安装Brew
    PHP中三维数组转二位数组,并且根据某个字段去重
    LNMP环境安装Laravel之后, 除了根目录下可以访问, 其他都是404页面
    LNMP一键安装包安装的mysql远程连接不上的问题
    CentOS7 安装Redis4.0
    CentOS 7 源码包安装SVN及使用
  • 原文地址:https://www.cnblogs.com/securitybob/p/14023806.html
Copyright © 2011-2022 走看看