前言
MySQL数据库锁是实现数据一致性,解决并发问题的重要手段。数据库是一个多用户共享的资源,当出现并发的时候,就会导致出现各种各样奇怪的问题,就像程序代码一样,出现多线程并发的时候,如果不做特殊控制的话,就会出现意外的事情,比如“脏“数据、修改丢失等问题。所以数据库并发需要使用事务来控制,事务并发问题需要数据库锁来控制,所以数据库锁是跟并发控制和事务联系在一起的。
本文主要描述基于更新SQL语句来理解MySQL锁定。下面话不多说了,来一起看看详细的介绍吧
一、构造环境
(root@localhost) [user]> show variables like 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.7.23-log | +---------------+------------+ (root@localhost) [user]> desc t1; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | n | int(11) | YES | | NULL | | | table_name | varchar(64) | YES | | NULL | | | column_name | varchar(64) | YES | | NULL | | | pad | varchar(100) | YES | | NULL | | +-------------+--------------+------+-----+---------+----------------+ (root@localhost) [user]> select count(*) from t1; +----------+ | count(*) | +----------+ | 3406 | +----------+ (root@localhost) [user]> create unique index idx_t1_pad on t1(pad); Query OK, 0 rows affected (0.35 sec) Records: 0 Duplicates: 0 Warnings: 0 (root@localhost) [user]> create index idx_t1_n on t1(n); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 (root@localhost) [user]> show index from t1; +-------+------------+------------+--------------+-------------+-----------+-------------+------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Null | Index_type | +-------+------------+------------+--------------+-------------+-----------+-------------+------+------------+ | t1 | 0 | PRIMARY | 1 | id | A | 3462 | | BTREE | | t1 | 0 | idx_t1_pad | 1 | pad | A | 3406 | YES | BTREE | | t1 | 1 | idx_t1_n | 1 | n | A | 12 | YES | BTREE | +-------+------------+------------+--------------+-------------+-----------+-------------+------+------------+ select 'Leshami' author,'http://blog.csdn.net/leshami' Blog; +---------+------------------------------+ | author | Blog | +---------+------------------------------+ | Leshami | http://blog.csdn.net/leshami | +---------+------------------------------+
二、基于主键更新
(root@localhost) [user]> start transaction; Query OK, 0 rows affected (0.00 sec) (root@localhost) [user]> update t1 set table_name='t1' where id=1299; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_tables_locked, trx_rows_locked, trx_rows_modified, trx_isolation_level FROM INFORMATION_SCHEMA.INNODB_TRX \G -- 从下面的结果可知,trx_rows_locked,一行被锁定 *************************** 1. row *************************** trx_id: 6349647 trx_state: RUNNING trx_started: 2018-11-06 16:54:12 trx_mysql_thread_id: 2 trx_tables_locked: 1 trx_rows_locked: 1 trx_rows_modified: 1 trx_isolation_level: REPEATABLE READ (root@localhost) [user]> rollback; Query OK, 0 rows affected (0.01 sec)
三、基于二级唯一索引
(root@localhost) [user]> start transaction; Query OK, 0 rows affected (0.00 sec) (root@localhost) [user]> update t1 set table_name='t2' where pad='4f39e2a03df3ab94b9f6a48c4aecdc0b'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_tables_locked, trx_rows_locked, trx_rows_modified, trx_isolation_level FROM INFORMATION_SCHEMA.INNODB_TRX \G -- 从下面的查询结果可知,trx_rows_locked,2行被锁定 *************************** 1. row *************************** trx_id: 6349649 trx_state: RUNNING trx_started: 2018-11-06 16:55:22 trx_mysql_thread_id: 2 trx_tables_locked: 1 trx_rows_locked: 2 trx_rows_modified: 1 trx_isolation_level: REPEATABLE READ (root@localhost) [user]> rollback; Query OK, 0 rows affected (0.00 sec)
三、基于二级非唯一索引
(root@localhost) [user]> start transaction; Query OK, 0 rows affected (0.00 sec) (root@localhost) [user]> update t1 set table_name='t3' where n=8; Query OK, 350 rows affected (0.01 sec) Rows matched: 351 Changed: 351 Warnings: 0 SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_tables_locked, trx_rows_locked, trx_rows_modified, trx_isolation_level FROM INFORMATION_SCHEMA.INNODB_TRX \G --从下面的查询结果可知,703行被锁定 *************************** 1. row *************************** trx_id: 6349672 trx_state: RUNNING trx_started: 2018-11-06 17:06:53 trx_mysql_thread_id: 2 trx_tables_locked: 1 trx_rows_locked: 703 trx_rows_modified: 351 trx_isolation_level: REPEATABLE READ (root@localhost) [user]> rollback; Query OK, 0 rows affected (0.00 sec)
四、无索引更新
(root@localhost) [user]> start transaction; Query OK, 0 rows affected (0.00 sec) (root@localhost) [user]> update t1 set table_name='t4' where column_name='id'; Query OK, 26 rows affected (0.00 sec) Rows matched: 26 Changed: 26 Warnings: 0 SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_tables_locked, trx_rows_locked, trx_rows_modified, trx_isolation_level FROM INFORMATION_SCHEMA.INNODB_TRX \G -- 从下面的查询结果可知,trx_rows_locked,3429行被锁定,而被更新的仅仅为26行 -- 而且这个结果超出了表上的总行数3406 *************************** 1. row *************************** trx_id: 6349674 trx_state: RUNNING trx_started: 2018-11-06 17:09:41 trx_mysql_thread_id: 2 trx_tables_locked: 1 trx_rows_locked: 3429 trx_rows_modified: 26 trx_isolation_level: REPEATABLE READ (root@localhost) [user]> rollback; Query OK, 0 rows affected (0.00 sec) -- 也可以通过show engine innodb status进行观察 show engine innodb status\G ------------ TRANSACTIONS ------------ Trx id counter 6349584 Purge done for trx's n:o < 0 undo n:o < 0 state: running but idle History list length 0 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 421943222819552, not started 0 lock struct(s), heap size 1136, 0 row lock(s) ---TRANSACTION 6349583, ACTIVE 2 sec 2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1 ------------ TRANSACTIONS ------------ Trx id counter 6349586 Purge done for trx's n:o < 6349585 undo n:o < 0 state: running but idle History list length 1 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 421943222819552, not started 0 lock struct(s), heap size 1136, 0 row lock(s) ---TRANSACTION 6349585, ACTIVE 8 sec 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 MySQL thread id 2, OS thread handle 140467640694528, query id 29 localhost root
五、锁相关查询SQL
1:查看当前的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2:查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3:查看当前等锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id thr_id, trx_tables_locked tb_lck, trx_rows_locked rows_lck, trx_rows_modified row_mfy, trx_isolation_level is_lvl FROM INFORMATION_SCHEMA.INNODB_TRX; SELECT r.`trx_id` waiting_trx_id, r.`trx_mysql_thread_id` waiting_thread, r.`trx_query` waiting_query, b.`trx_id` bolcking_trx_id, b.`trx_mysql_thread_id` blocking_thread, b.`trx_query` block_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`;
六、小结
1、MySQL表更新时,对记录的锁定根据更新时where谓词条件来确定锁定范围
2、对于聚簇索引过滤,由于索引即数据,因为仅仅锁定更新行,这是由聚簇索引的性质决定的
3、对于非聚簇唯一索引过滤,由于需要回表,因此锁定为唯一索引过滤行数加上回表行数
4、对于非聚簇非唯一索引过滤,涉及到了间隙锁,因此锁定的记录数更多
5、如果过滤条件无任何索引或无法使用到索引,则锁定整张表上所有数据行
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]