mysql8学习笔记32--锁机制和事务1

        MySQL 5.5 版本以后,information_schema(ski:mə) 库中新增了三个关于锁的表,亦即 innodb_trx 、data_locks 和 innodb_lock_waits 。其中 innodb_trx 表记录当前运行的所有事务,data_locks 表记录当前出现的锁,innodb_lock_waits 表记录锁等待的对应关系

• InnoDB存储引擎支持行级锁,其大类可以细分为共享锁和排它锁两类
• 共享锁(S):允许拥有共享锁的事务读取该行数据。当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁
• 排它锁(X):允许拥有排它锁的事务修改或删除该行数据。当一个事务拥有一行的排他锁时,另外的事务在此行数据上无法获得共享锁和排它锁,只能等待第一个事务的锁释放
• 除了共享锁和排他锁之外,InnoDB也支持意图锁。该锁类型是属于表级锁表明事务在后期会对该表的行施加共享锁或者排它锁。所以对意图锁也有两种类型:
    • 共享意图锁(IS):事务将会对表的行施加共享锁
    • 排他意图锁(IX):事务将会对表的行施加排它锁
 
• 举例来说select … for share mode语句就是施加了共享意图锁,⽽select … for update语句就是施加了排他意图锁
• 这四种锁之间的相互共存和排斥关系如下:
• 所以决定⼀个事务请求为数据加锁时能否⽴即施加上锁,取决于该数据上已经存在的锁是否和请求的锁可以共存还是排斥关系,当相互之间是可以共存时则⽴即施加锁,当相互之间是排斥关系时则需要等待已经存在的锁被释放才能施加
•Information_schema.innodb_trx记录了InnoDB中每⼀个正在执⾏的事务,包括该事务获得的锁信息,事务开始时间,事务是否在等待锁等信息

 

#连接一:
mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> update student set sname='小三' where stuid = 12;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>
连接二:
mysql> update student set sname='小三' where stuid = 12;
#进入阻塞状态
连接三查看
mysql> select * from Information_schema.innodb_trx;
+--------+-----------+---------------------+-----------------------+---------------------+------------+---------------------+----------------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| trx_id | trx_state | trx_started         | trx_requested_lock_id | trx_wait_started    | trx_weight | trx_mysql_thread_id | trx_query                                          | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+--------+-----------+---------------------+-----------------------+---------------------+------------+---------------------+----------------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| 24610  | LOCK WAIT | 2021-05-24 22:08:25 | 24610:54:4:13         | 2021-05-24 22:08:25 |          2 |                   9 | update student set sname='小三' where stuid = 12   | starting index read |                 1 |                 1 |                2 |                  1136 |               1 |                 0 |                       0 | REPEATABLE READ     |                 1 |                      1 | NULL                       |                         0 |                         0 |                0 |                          0 |
| 24608  | RUNNING   | 2021-05-24 22:04:03 | NULL                  | NULL                |          3 |                   8 | NULL                                               | NULL                |                 0 |                 1 |                2 |                  1136 |               1 |                 1 |                       0 | REPEATABLE READ     |                 1 |                      1 | NULL                       |                         0 |                         0 |                0 |                          0 |
+--------+-----------+---------------------+-----------------------+---------------------+------------+---------------------+----------------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
2 rows in set (0.00 sec)

mysql> 

当超过设置超时时间则:

mysql> update student set sname='小三' where stuid = 12;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> 

Information_schema.innodb_trx里是在事务的维度记录正在执行的事务信息的,虽然有包含事务的锁信息,但是不能判断锁是与哪个有冲突,需要继续通过data_locks记录查看

当一个事务获得锁和等待锁的时候,都会在这儿记录

mysql> select * from performance_schema.data_locks;
+--------+----------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE     | LOCK_STATUS | LOCK_DATA |
+--------+----------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| INNODB | 24610:1112     |                 24610 |        47 |       38 | school        | student     | NULL           | NULL              | NULL       |       140307387688984 | TABLE     | IX            | GRANTED     | NULL      |
| INNODB | 24610:54:4:13  |                 24610 |        47 |       38 | school        | student     | NULL           | NULL              | PRIMARY    |       140307387685944 | RECORD    | X,REC_NOT_GAP | WAITING     | 12        |
| INNODB | 24608:1112     |                 24608 |        46 |       50 | school        | student     | NULL           | NULL              | NULL       |       140307387683032 | TABLE     | IX            | GRANTED     | NULL      |
| INNODB | 24608:54:4:13  |                 24608 |        46 |       50 | school        | student     | NULL           | NULL              | PRIMARY    |       140307387679992 | RECORD    | X,REC_NOT_GAP | GRANTED     | 12        |
+--------+----------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
4 rows in set (0.28 sec)

sys.innodb_lock_waits更直接的记录了InnoDB中事务之间相互等待锁的信息

mysql> select * from sys.innodb_lock_waits;
+---------------------+----------+---------------+--------------------+---------------------+-------------------+------------------------+---------------------------+--------------+-------------+----------------+---------------------+-----------------+-------------------------+---------------------------+-------------+----------------------------------------------------+-----------------+-------------------+-----------------+--------------+----------------+------------------+--------------------+----------------------+------------------+--------------------------+----------------------------+-------------------------+------------------------------+
| wait_started        | wait_age | wait_age_secs | locked_table       | locked_table_schema | locked_table_name | locked_table_partition | locked_table_subpartition | locked_index | locked_type | waiting_trx_id | waiting_trx_started | waiting_trx_age | waiting_trx_rows_locked | waiting_trx_rows_modified | waiting_pid | waiting_query                                      | waiting_lock_id | waiting_lock_mode | blocking_trx_id | blocking_pid | blocking_query | blocking_lock_id | blocking_lock_mode | blocking_trx_started | blocking_trx_age | blocking_trx_rows_locked | blocking_trx_rows_modified | sql_kill_blocking_query | sql_kill_blocking_connection |
+---------------------+----------+---------------+--------------------+---------------------+-------------------+------------------------+---------------------------+--------------+-------------+----------------+---------------------+-----------------+-------------------------+---------------------------+-------------+----------------------------------------------------+-----------------+-------------------+-----------------+--------------+----------------+------------------+--------------------+----------------------+------------------+--------------------------+----------------------------+-------------------------+------------------------------+
| 2021-05-24 22:26:41 | 00:00:11 |            11 | `school`.`student` | school              | student           | NULL                   | NULL                      | PRIMARY      | RECORD      | 24610          | 2021-05-24 22:26:41 | 00:00:11        |                       1 |                         0 |           9 | update student set sname='小三' where stuid = 12   | 24610:54:4:13   | X,REC_NOT_GAP     | 24608           |            8 | NULL           | 24608:54:4:13    | X,REC_NOT_GAP      | 2021-05-24 22:04:03  | 00:22:49         |                        1 |                          1 | KILL QUERY 8            | KILL 8                       |
+---------------------+----------+---------------+--------------------+---------------------+-------------------+------------------------+---------------------------+--------------+-------------+----------------+---------------------+-----------------+-------------------------+---------------------------+-------------+----------------------------------------------------+-----------------+-------------------+-----------------+--------------+----------------+------------------+--------------------+----------------------+------------------+--------------------------+----------------------------+-------------------------+------------------------------+
1 row in set (0.12 sec)

mysql> 

如果要追根溯源,可通过performance_schema.data_locks里的thread_id 和 event_id在performance_schema.events_statements_current里定位

mysql> select * from performance_schema.events_statements_current where thread_id=46;
+-----------+----------+--------------+----------------------+---------------------------------+------------------+------------------+------------+-----------+----------------------------------------------------+------------------------------------------------------------------+----------------------------------------------------+----------------+-------------+---------------+-------------+-----------------------+-------------+-------------------+------------------------------------------+--------+----------+---------------+-----------+---------------+-------------------------+--------------------+------------------+------------------------+--------------+--------------------+-------------+-------------------+------------+-----------+-----------+---------------+--------------------+------------------+--------------------+---------------------+
| THREAD_ID | EVENT_ID | END_EVENT_ID | EVENT_NAME           | SOURCE                          | TIMER_START      | TIMER_END        | TIMER_WAIT | LOCK_TIME | SQL_TEXT                                           | DIGEST                                                           | DIGEST_TEXT                                        | CURRENT_SCHEMA | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | OBJECT_INSTANCE_BEGIN | MYSQL_ERRNO | RETURNED_SQLSTATE | MESSAGE_TEXT                             | ERRORS | WARNINGS | ROWS_AFFECTED | ROWS_SENT | ROWS_EXAMINED | CREATED_TMP_DISK_TABLES | CREATED_TMP_TABLES | SELECT_FULL_JOIN | SELECT_FULL_RANGE_JOIN | SELECT_RANGE | SELECT_RANGE_CHECK | SELECT_SCAN | SORT_MERGE_PASSES | SORT_RANGE | SORT_ROWS | SORT_SCAN | NO_INDEX_USED | NO_GOOD_INDEX_USED | NESTING_EVENT_ID | NESTING_EVENT_TYPE | NESTING_EVENT_LEVEL |
+-----------+----------+--------------+----------------------+---------------------------------+------------------+------------------+------------+-----------+----------------------------------------------------+------------------------------------------------------------------+----------------------------------------------------+----------------+-------------+---------------+-------------+-----------------------+-------------+-------------------+------------------------------------------+--------+----------+---------------+-----------+---------------+-------------------------+--------------------+------------------+------------------------+--------------+--------------------+-------------+-------------------+------------+-----------+-----------+---------------+--------------------+------------------+--------------------+---------------------+
|        46 |       48 |           49 | statement/sql/update | init_net_server_extension.cc:95 | 4362938279055000 | 4362938832688000 |  553633000 | 144000000 | update student set sname='小三' where stuid = 12   | 40ce967e64aeeb1f8e87d1bf618ba90d8f9a95fcb861618f52e1776b889f04fb | UPDATE `student` SET `sname` = ? WHERE `stuid` = ? | school         | NULL        | NULL          | NULL        |                  NULL |           0 | 00000             | Rows matched: 1  Changed: 1  Warnings: 0 |      0 |        0 |             1 |         0 |             1 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           0 |                 0 |          0 |         0 |         0 |             0 |                  0 |             NULL | NULL               |                   0 |
+-----------+----------+--------------+----------------------+---------------------------------+------------------+------------------+------------+-----------+----------------------------------------------------+------------------------------------------------------------------+----------------------------------------------------+----------------+-------------+---------------+-------------+-----------------------+-------------+-------------------+------------------------------------------+--------+----------+---------------+-----------+---------------+-------------------------+--------------------+------------------+------------------------+--------------+--------------------+-------------+-------------------+------------+-----------+-----------+---------------+--------------------+------------------+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> 

 

mysql> select * from performance_schema.events_statements_history where thread_id=46 order by event_id;
+-----------+----------+--------------+---------------------------------+---------------------------------+------------------+------------------+-------------+-----------+----------------------------------------------------+------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+-------------+---------------+-------------+-----------------------+-------------+-------------------+------------------------------------------+--------+----------+---------------+-----------+---------------+-------------------------+--------------------+------------------+------------------------+--------------+--------------------+-------------+-------------------+------------+-----------+-----------+---------------+--------------------+------------------+--------------------+---------------------+
| THREAD_ID | EVENT_ID | END_EVENT_ID | EVENT_NAME                      | SOURCE                          | TIMER_START      | TIMER_END        | TIMER_WAIT  | LOCK_TIME | SQL_TEXT                                           | DIGEST                                                           | DIGEST_TEXT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | CURRENT_SCHEMA | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | OBJECT_INSTANCE_BEGIN | MYSQL_ERRNO | RETURNED_SQLSTATE | MESSAGE_TEXT                             | ERRORS | WARNINGS | ROWS_AFFECTED | ROWS_SENT | ROWS_EXAMINED | CREATED_TMP_DISK_TABLES | CREATED_TMP_TABLES | SELECT_FULL_JOIN | SELECT_FULL_RANGE_JOIN | SELECT_RANGE | SELECT_RANGE_CHECK | SELECT_SCAN | SORT_MERGE_PASSES | SORT_RANGE | SORT_ROWS | SORT_SCAN | NO_INDEX_USED | NO_GOOD_INDEX_USED | NESTING_EVENT_ID | NESTING_EVENT_TYPE | NESTING_EVENT_LEVEL |
+-----------+----------+--------------+---------------------------------+---------------------------------+------------------+------------------+-------------+-----------+----------------------------------------------------+------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+-------------+---------------+-------------+-----------------------+-------------+-------------------+------------------------------------------+--------+----------+---------------+-----------+---------------+-------------------------+--------------------+------------------+------------------------+--------------+--------------------+-------------+-------------------+------------+-----------+-----------+---------------+--------------------+------------------+--------------------+---------------------+
|        46 |       33 |           33 | statement/com/Field List        | init_net_server_extension.cc:95 | 4104147871107000 | 4104148468098000 |   596991000 | 450000000 | NULL                                               | NULL                                                             | NULL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |         0 |             0 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           0 |                 0 |          0 |         0 |         0 |             0 |                  0 |             NULL | NULL               |                   0 |
|        46 |       34 |           35 | statement/sql/show_tables       | init_net_server_extension.cc:95 | 4106939208994000 | 4106940533255000 |  1324261000 | 760000000 | show tables                                        | e60aef21fcdd1f23c8bc9b9f5002614d0aeb5c0b7c5bc12618209f0726b16a46 | SELECT `cat` . `name` AS `TABLE_CATALOG` , `sch` . `name` AS `TABLE_SCHEMA` , `tbl` . `name` AS `TABLE_NAME` , `tbl` . `type` AS `TABLE_TYPE` , IF ( ( `tbl` . `type` = ? ) , `tbl` . `engine` , ? ) AS `ENGINE` , IF ( ( `tbl` . `type` = ? ) , ?, ... ) AS `VERSION` , `tbl` . `row_format` AS `ROW_FORMAT` , `internal_table_rows` ( `sch` . `name` , `tbl` . `name` , IF ( `isnull` ( `tbl` . `partition_type` ) , `tbl` . `engine` , ? ) , `tbl` . `se_private_id` , ( `tbl` . `hidden` != ? ) , `ts` . `se_private_data` , COALESCE ( `stat` . `table_rows` , ? ) , COALESCE ( CAST ( `stat` . `cached_time` AS UNSIGNED ) , ? ) ) AS `TABLE_ROWS` , `internal_avg_row_length` ( `sch` . `name` , `tbl` . `name` , IF ( `isnull` ( `tbl` . `partition_type` ) , `tbl` . `engine` , ? ) , `tbl` . `se_private_id` , ( `tbl` . `hidden` != ? ) , `ts` . `se_private_data` , COALESCE ( `stat` . `avg_row_length` , ? ) , COALESCE ( CAST ( `stat` . `cached_time` AS UNSIGNED ) , ? ) ) AS `AVG_ROW_LENGTH` , `internal_data_length` ( `sch` . `name` , `tbl` . | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |        24 |           104 |                       0 |                  1 |                0 |                      0 |            0 |                  0 |           1 |                 0 |          0 |        24 |         1 |             0 |                  0 |             NULL | NULL               |                   0 |
|        46 |       36 |           37 | statement/sql/select            | init_net_server_extension.cc:95 | 4115308650886000 | 4115326637721000 | 17986835000 | 114000000 | select * from t2                                   | c74f7ac2e7520fcbd10db5df148c439167b387c3a0f64d4980a9f549dbbf2119 | SELECT * FROM `t2`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |         0 |             0 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           1 |                 0 |          0 |         0 |         0 |             1 |                  0 |             NULL | NULL               |                   0 |
|        46 |       38 |           39 | statement/sql/select            | init_net_server_extension.cc:95 | 4117384414808000 | 4117417965409000 | 33550601000 | 132000000 | select * from t1                                   | 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a | SELECT * FROM `t1`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |         3 |             3 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           1 |                 0 |          0 |         0 |         0 |             1 |                  0 |             NULL | NULL               |                   0 |
|        46 |       40 |           41 | statement/sql/select            | init_net_server_extension.cc:95 | 4127935607763000 | 4127969000937000 | 33393174000 | 133000000 | select * from student                              | 054c03cefdffd38c41c9012f4df4fbaa40f747b8a6dbe924458daf8e92ccd3bc | SELECT * FROM `student`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |        13 |            13 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           1 |                 0 |          0 |         0 |         0 |             1 |                  0 |             NULL | NULL               |                   0 |
|        46 |       42 |           42 | statement/sql/show_create_table | init_net_server_extension.cc:95 | 4136194629870000 | 4136194937040000 |   307170000 |         0 | show create table student                          | 23a0a09d9efd6567b078ffc509d9a4cc0455cd04872a5bda641323296536a671 | SHOW CREATE TABLE `student`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |         0 |             0 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           0 |                 0 |          0 |         0 |         0 |             0 |                  0 |             NULL | NULL               |                   0 |
|        46 |       43 |           44 | statement/sql/select            | init_net_server_extension.cc:95 | 4153823209414000 | 4153823435210000 |   225796000 | 104000000 | select * from student                              | 054c03cefdffd38c41c9012f4df4fbaa40f747b8a6dbe924458daf8e92ccd3bc | SELECT * FROM `student`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |        13 |            13 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           1 |                 0 |          0 |         0 |         0 |             1 |                  0 |             NULL | NULL               |                   0 |
|        46 |       45 |           46 | statement/sql/select            | init_net_server_extension.cc:95 | 4270354929331000 | 4270355208201000 |   278870000 | 110000000 | select * from student where stuid = 12             | 69387c1f86ce2121d9b343c1504316f27219170bbc09d63ea820da4420a1b2c4 | SELECT * FROM `student` WHERE `stuid` = ?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | school         | NULL        | NULL          | NULL        |                  NULL |           0 | NULL              | NULL                                     |      0 |        0 |             0 |         1 |             1 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           0 |                 0 |          0 |         0 |         0 |             0 |                  0 |             NULL | NULL               |                   0 |
|        46 |       47 |           47 | statement/sql/set_option        | init_net_server_extension.cc:95 | 4330048794531000 | 4330048943630000 |   149099000 |         0 | set autocommit = 0                                 | 158bfe3d4b4b0a372a4acdb38affe2cb4f6b3cb21a9af0ea9fad9a9a083ac18a | SET `autocommit` = ?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | school         | NULL        | NULL          | NULL        |                  NULL |           0 | 00000             | NULL                                     |      0 |        0 |             0 |         0 |             0 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           0 |                 0 |          0 |         0 |         0 |             0 |                  0 |             NULL | NULL               |                   0 |
|        46 |       48 |           49 | statement/sql/update            | init_net_server_extension.cc:95 | 4362938279055000 | 4362938832688000 |   553633000 | 144000000 | update student set sname='小三' where stuid = 12   | 40ce967e64aeeb1f8e87d1bf618ba90d8f9a95fcb861618f52e1776b889f04fb | UPDATE `student` SET `sname` = ? WHERE `stuid` = ?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | school         | NULL        | NULL          | NULL        |                  NULL |           0 | 00000             | Rows matched: 1  Changed: 1  Warnings: 0 |      0 |        0 |             1 |         0 |             1 |                       0 |                  0 |                0 |                      0 |            0 |                  0 |           0 |                 0 |          0 |         0 |         0 |             0 |                  0 |             NULL | NULL               |                   0 |
+-----------+----------+--------------+---------------------------------+---------------------------------+------------------+------------------+-------------+-----------+----------------------------------------------------+------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+-------------+---------------+-------------+-----------------------+-------------+-------------------+------------------------------------------+--------+----------+---------------+-----------+---------------+-------------------------+--------------------+------------------+------------------------+--------------+--------------------+-------------+-------------------+------------+-----------+-----------+---------------+--------------------+------------------+--------------------+---------------------+
10 rows in set (0.00 sec)

mysql> 

 

 

 

•performance_schema.data_locks记录了InnoDB中事务的每个锁信息,以及当前事务的锁正在阻⽌其他事务获得锁

lock_mode:锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。

列名含义
ENGINE 存储引擎
ENGINE_LOCK_ID 锁的ID
ENGINE_TRANSACTION_ID 存储引擎内部ID
THREAD_ID trx_id
EVENT_ID 会话ID
OBJECT_SCHEMA 数据库名称
OBJECT_NAME 表名称
PARTITION_NAME 分区名称
SUBPARTITION_NAME 子分区名称
INDEX_NAME 索引名称
OBJECT_INSTANCE_BEGIN 锁的内存中的地址
LOCK_TYPE 锁的类型
LOCK_MODE 如何请求锁定
LOCK_STATUS 请求状态
LOCK_DATA 锁定数据量

mysql> select * from performance_schema.data_locks ;
Empty set (0.28 sec)

mysql> select * from Information_schema.innodb_trx ;
Empty set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>  select * from teacher;
+------+---------+
| tno  | tname   |
+------+---------+
| t001 | 刘冬2   |
| t002 | 刘冬    |
| t003 | 刘冬    |
| t004 | 刘冬    |
| t005 | 刘冬    |
+------+---------+
5 rows in set (0.01 sec)

mysql> select * from Information_schema.innodb_trx ;
+-----------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+---------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| trx_id          | trx_state | trx_started         | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query                                   | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+-----------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+---------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| 421783691864824 | RUNNING   | 2021-05-23 18:15:17 | NULL                  | NULL             |          0 |                   8 | select * from Information_schema.innodb_trx | NULL                |                 0 |                 0 |                0 |                  1136 |               0 |                 0 |                       0 | REPEATABLE READ     |                 1 |                      1 | NULL                       |                         0 |                         0 |                0 |                          0 |
+-----------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+---------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
1 row in set (0.00 sec)

mysql> select * from performance_schema.data_locks ;
Empty set (0.00 sec)

mysql> 
mysql> 
mysql> #说明单纯的select查询不会加锁
mysql> select * from teacher lock in shade mode;#增加一个共享意图锁
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'shade mode' at line 1
mysql> select * from teacher lock in shade mode;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'shade mode' at line 1
mysql> select * from teacher lock in share mode;#增加一个共享意图锁 
+------+---------+
| tno  | tname   |
+------+---------+
| t001 | 刘冬2   |
| t002 | 刘冬    |
| t003 | 刘冬    |
| t004 | 刘冬    |
| t005 | 刘冬    |
+------+---------+
5 rows in set (0.00 sec)

mysql> select * from performance_schema.data_locks ;
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+-----------+-------------+------------------------+
| ENGINE | ENGINE_LOCK_ID         | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE | LOCK_STATUS | LOCK_DATA              |
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+-----------+-------------+------------------------+
| INNODB | 421783691864824:1104   |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | NULL       |       140308595648536 | TABLE     | IS        | GRANTED     | NULL                   |
| INNODB | 421783691864824:46:4:1 |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S         | GRANTED     | supremum pseudo-record |
| INNODB | 421783691864824:46:4:3 |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S         | GRANTED     | 't002'                 |
| INNODB | 421783691864824:46:4:4 |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S         | GRANTED     | 't003'                 |
| INNODB | 421783691864824:46:4:5 |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S         | GRANTED     | 't005'                 |
| INNODB | 421783691864824:46:4:6 |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S         | GRANTED     | 't004'                 |
| INNODB | 421783691864824:46:4:7 |       421783691864824 |        46 |       43 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S         | GRANTED     | 't001'                 |
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+-----------+-------------+------------------------+
7 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from performance_schema.data_locks ;
Empty set (0.00 sec)

mysql> #刚刚由于没有用where筛选,所以对表里每一行都加了共享意图锁
mysql> select * from teacher where tno='t001' lock in share mode;#增加一个共享意图锁
+------+---------+
| tno  | tname   |
+------+---------+
| t001 | 刘冬2   |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from performance_schema.data_locks ;
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID         | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE     | LOCK_STATUS | LOCK_DATA |
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| INNODB | 421783691864824:1104   |       421783691864824 |        46 |       48 | school        | teacher     | NULL           | NULL              | NULL       |       140308595648536 | TABLE     | IS            | GRANTED     | NULL      |
| INNODB | 421783691864824:46:4:7 |       421783691864824 |        46 |       48 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S,REC_NOT_GAP | GRANTED     | 't001'    |
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
2 rows in set (0.00 sec)

mysql> 

接着再另个session也执行下

mysql> use school
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from teacher where tno='t001' lock in share mode;#两个IS 之间是包容的
+------+---------+
| tno  | tname   |
+------+---------+
| t001 | 刘冬2   |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from performance_schema.data_locks ;
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID         | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE     | LOCK_STATUS | LOCK_DATA |
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| INNODB | 421783691864824:1104   |       421783691864824 |        46 |       48 | school        | teacher     | NULL           | NULL              | NULL       |       140308595648536 | TABLE     | IS            | GRANTED     | NULL      |
| INNODB | 421783691864824:46:4:7 |       421783691864824 |        46 |       48 | school        | teacher     | NULL           | NULL              | PRIMARY    |       140308595645496 | RECORD    | S,REC_NOT_GAP | GRANTED     | 't001'    |
+--------+------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
2 rows in set (0.00 sec)

mysql> update teacher set tname='张三' where tno='t001';#IS与X是冲突的,所以进入阻塞状态,得等IS提交。
#
session 1 mysql> commit;
Query OK, 0 rows affected (0.00 sec)

session 2 mysql> update teacher set tname='张三' where tno='t001';
ERROR 1062 (23000): Duplicate entry 't001' for key 'PRIMARY'
mysql> 

 

 

 

 

•sys.innodb_lock_waits记录了InnoDB中事务之间相互等待锁的信息

 

 

 

 

 

 

 
posted @ 2021-05-24 23:19  爬行的龟  阅读(349)  评论(0编辑  收藏  举报
如有错误,欢迎指正 邮箱656521736@qq.com