mysql 锁

表锁,锁住整个表

回话a
mysql> lock tables sakila.film write;
Query OK, 0 rows affected (0.00 sec)
回话b,执行任何语句就hang在那
mysql> select 1 from sakila.film LIMIT 1;

通过 show processlist;可以看到会话id 23正在看到表锁住table metadata lock
mysql> show processlist;
+----+------+-----------+--------+---------+------+---------------------------------+-----------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+--------+---------+------+---------------------------------+-----------------------------------+
| 26 | root | localhost | sakila | Query | 424 | Waiting for table metadata lock | select 1 from sakila.film LIMIT 1 |
| 27 | root | localhost | sakila | Sleep | 428 | | NULL |
| 28 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+--------+---------+------+---------------------------------+-----------------------------------+
3 rows in set (0.00 sec)

  行锁

回话a
 update sakila.film set rental_duration=sleep(200) where film_id=1000;
回话b
update sakila.film set title='ZORRO ARK QDDS' where film_id=1000;

查看进程和锁
mysql> show processlist;
+----+------+----------------------+--------------------+---------+------+------------+----------------------------------------------------------------------+
| Id | User | Host                 | db                 | Command | Time | State      | Info                                                                 |
+----+------+----------------------+--------------------+---------+------+------------+----------------------------------------------------------------------+
| 30 | root | localhost            | sakila             | Query   |   11 | User sleep | update sakila.film set rental_duration=sleep(200) where film_id=1000 |
| 31 | root | 192.168.20.200:53718 | information_schema | Sleep   |  932 |            | NULL                                                                 |
| 32 | root | 192.168.20.200:53731 | information_schema | Sleep   | 1195 |            | NULL                                                                 |
| 33 | root | localhost            | NULL               | Query   |    0 | starting   | show processlist                                                     |
| 34 | root | localhost            | sakila             | Query   |    8 | updating   | update sakila.film set title='ZORRO ARK QDDS' where film_id=1000     |
| 35 | root | localhost            | NULL               | Sleep   | 2828 |            | NULL                                                                 |
| 36 | root | 192.168.20.200:53860 | ht                 | Sleep   | 1271 |            | NULL                                                                 |
| 37 | root | 192.168.20.200:53861 | ht                 | Sleep   | 1271 |            | NULL                                                                 |
+----+------+----------------------+--------------------+---------+------+------------+----------------------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> SELECT
    ->   r.trx_id waiting_trx_id,
    ->   r.trx_mysql_thread_id waiting_thread,
    ->   r.trx_query waiting_query,
    ->   b.trx_id blocking_trx_id,
    ->   b.trx_mysql_thread_id blocking_thread,
    ->   b.trx_query blocking_query
    -> FROM       information_schema.innodb_lock_waits w
    -> INNER JOIN information_schema.innodb_trx b
    ->   ON b.trx_id = w.blocking_trx_id
    -> INNER JOIN information_schema.innodb_trx r
    ->   ON r.trx_id = w.requesting_trx_id \G
*************************** 1. row ***************************
 waiting_trx_id: 2413493
 waiting_thread: 34
  waiting_query: update sakila.film set title='ZORRO ARK QDDS' where film_id=1000
blocking_trx_id: 2413492
blocking_thread: 30
 blocking_query: update sakila.film set rental_duration=sleep(200) where film_id=1000
1 row in set, 1 warning (0.00 sec)

mysql> select * from sys.innodb_lock_waits\G
*************************** 1. row ***************************
                wait_started: 2018-08-28 17:03:42
                    wait_age: 00:00:09
               wait_age_secs: 9
                locked_table: `sakila`.`film`
                locked_index: PRIMARY
                 locked_type: RECORD
              waiting_trx_id: 2413493
         waiting_trx_started: 2018-08-28 17:03:42
             waiting_trx_age: 00:00:09
     waiting_trx_rows_locked: 1
   waiting_trx_rows_modified: 0
                 waiting_pid: 34
               waiting_query: update sakila.film set title='ZORRO ARK QDDS' where film_id=1000
             waiting_lock_id: 2413493:176:19:26
           waiting_lock_mode: X
             blocking_trx_id: 2413492
                blocking_pid: 30
              blocking_query: update sakila.film set rental_ ... =sleep(200) where film_id=1000
            blocking_lock_id: 2413492:176:19:26
          blocking_lock_mode: X
        blocking_trx_started: 2018-08-28 17:03:39
            blocking_trx_age: 00:00:12
    blocking_trx_rows_locked: 1
  blocking_trx_rows_modified: 0
     sql_kill_blocking_query: KILL QUERY 30
sql_kill_blocking_connection: KILL 30
1 row in set, 3 warnings (0.01 sec)

查看没有提交的事务也能看出来

SELECT
trx_id,
INNODB_TRX.trx_state,
INNODB_TRX.trx_started,
se.conn_id AS processlist_id,
trx_lock_memory_bytes,
se.USER,
se.command,
se.state,
se.current_statement,
se.last_statement
FROM
information_schema.INNODB_TRX,
sys.session AS se
WHERE
trx_mysql_thread_id = conn_id

mysql> SELECT
    -> trx_id,
    -> INNODB_TRX.trx_state,
    -> INNODB_TRX.trx_started,
    -> se.conn_id AS processlist_id,
    -> trx_lock_memory_bytes,
    -> se.USER,
    -> se.command,
    -> se.state,
    -> se.current_statement,
    -> se.last_statement 
    -> FROM
    -> information_schema.INNODB_TRX,
    -> sys.session AS se 
    -> WHERE
    -> trx_mysql_thread_id = conn_id \G
*************************** 1. row ***************************
               trx_id: 2413492
            trx_state: RUNNING
          trx_started: 2018-08-28 17:03:39
       processlist_id: 30
trx_lock_memory_bytes: 1136
                 user: root@localhost
              command: Query
                state: User sleep
    current_statement: update sakila.film set rental_ ... =sleep(200) where film_id=1000
       last_statement: NULL
*************************** 2. row ***************************
               trx_id: 2413493
            trx_state: LOCK WAIT
          trx_started: 2018-08-28 17:03:42
       processlist_id: 34
trx_lock_memory_bytes: 1136
                 user: root@localhost
              command: Query
                state: updating
    current_statement: update sakila.film set title='ZORRO ARK QDDS' where film_id=1000
       last_statement: NULL
2 rows in set (0.05 sec)

 innodb 行锁锁住时间默认时间为50秒,超过50秒就报错

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
1 row in set (0.00 sec)

mysql> update sakila.film set title='ZORRO ARK QDDS' where film_id=1000;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

  

 mysql8.0 锁  少一个视图information_schema.innodb_lock_waits,调整到sys schema下

当前被锁的语句

SELECT *
FROM performance_schema.events_statements_history
WHERE thread_id IN
(SELECT b. THREAD_ID
FROM sys. innodb_lock_waits AS a, performance_schema.threads AS b
WHERE a.waiting_pid = b. PROCESSLIST_ID)
ORDER BY timer_start ASC;

持锁的语句

SELECT *
FROM performance_schema.events_statements_history
WHERE thread_id IN
(SELECT b.THREAD_ID
FROM sys.innodb_lock_waits AS a, performance_schema.threads AS b
WHERE a.blocking_pid = b.PROCESSLIST_ID)
ORDER BY timer_start ASC;

  

  

posted @ 2018-08-27 17:25  刚好遇见Mysql  阅读(220)  评论(0编辑  收藏  举报