MySQL中的锁(InnoDB存储引擎)

MySQL中的锁(lock)

lock对象:数据库中的对象,如表、页、行。
lock释放:事务commit或者rollback以后(不同事务隔离级别释放的时间可能不同)

锁的分类
  • 行级锁
    1.共享锁
    2.排他锁
    共享锁是兼容锁,排他锁是不兼容锁。
    兼容指的是对同一记录锁的兼容性情况
  • 2意向锁(表锁show)
    1.意向共享锁
    2.意向排他锁
    目的:支持在不同粒度上进行加锁操作,这种锁允许事务在行级上的锁和表级上的锁同时存在
查看锁的信息

在INFORMATIOIN_SCHEMA架构上添加了表INNODB_TRX INNODB_LOCKS INNODB_LOCK_WAITS,通过查看这三张表可以分析事务中可能存在的锁的情况

前期准备:
1.创建表

CREATE TABLE t_bitfly (
  id bigint(20) NOT NULL DEFAULT '0',
  value varchar(32) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.插入数据

 mysql> insert into t_bitfly (1, 'a'),(2, 'b'),(3,'c'),(4,'d'),(5,'e');
  • 查看INNODB_TRX表

session1:

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

mysql> select * from t_bitfly where id < 4 for update;
+----+-------+
| id | value |
+----+-------+
|  1 | a     |
|  2 | b     |
|  3 | c     |
+----+-------+
3 rows in set (0.00 sec)

session2:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_bitfly where id >= 4 for update;

session1:

mysql> select * from information_schema.INNODB_TRX\G;
*************************** 1. row ***************************
                    trx_id: 2754
                 trx_state: LOCK WAIT
               trx_started: 2018-04-20 13:44:49
     trx_requested_lock_id: 2754:116:3:5
          trx_wait_started: 2018-04-20 14:00:04
                trx_weight: 2
       trx_mysql_thread_id: 13
                 trx_query: select * from t_bitfly where id >= 4 for update
       trx_operation_state: starting index read
         trx_tables_in_use: 1
         trx_tables_locked: 1
          trx_lock_structs: 2
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 2
         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: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
*************************** 2. row ***************************
                    trx_id: 2753
                 trx_state: RUNNING
               trx_started: 2018-04-20 13:42:45
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 2
       trx_mysql_thread_id: 12
                 trx_query: select * from information_schema.INNODB_TRX
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 1
          trx_lock_structs: 2
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 4
         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: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
2 rows in set (0.00 sec)

为什么会引起死锁,可以查看之前写的文章InnoDB存储引擎行级锁引起锁争用问题
字段说明:
trx_id:事务ID
trx_state:当前事务的状态
trx_started:事务开始的时间
trx_requested_lock_id:等待事物的锁ID,只有当trx_stateLOCK_WAIT时才会有值,否则为null
trx_weight:事务的权重,反映了一个事务修改和锁住的行数。在InnoDB存储引擎中,当发生死锁需要进行回滚时,会选择该值最小的事务进行回滚
trx_wait_started:事务等待开始的时间
trx_mysql_thread_id:MySQL中的线程ID
trx_query:事务运行的SQL语句
通过查看INNODB_TRX表信息后知道了trx_id为2754的事务处于LOCK WAIT状态,而trx_id为2753的事务处于RUNNING状态

  • 查看INNODB_LOCKS表
mysql>  select * from information_schema.INNODB_LOCKS\G;
*************************** 1. row ***************************
    lock_id: 2754:116:3:5
lock_trx_id: 2754
  lock_mode: X
  lock_type: RECORD
 lock_table: `study`.`t_bitfly`
 lock_index: PRIMARY
 lock_space: 116
  lock_page: 3
   lock_rec: 5
  lock_data: 4
*************************** 2. row ***************************
    lock_id: 2753:116:3:5
lock_trx_id: 2753
  lock_mode: X
  lock_type: RECORD
 lock_table: `study`.`t_bitfly`
 lock_index: PRIMARY
 lock_space: 116
  lock_page: 3
   lock_rec: 5
  lock_data: 4
2 rows in set, 1 warning (0.00 sec)

字段说明
lock_id: 锁的ID
lock_trx_id: 事务ID
lock_mode: 锁的模式
lock_type: 锁的类型,表锁还是行锁
lock_table: 要加锁的表
lock_index: 锁住的索引
lock_space: 锁对象的space id
lock_page: 事务锁定页的数量,若是表锁,则该值为NULL
lock_rec: 事务锁定行的数量,若是表锁,则该值为NULL
lock_data: 事务锁定记录的主键值,若是表锁,则该值为NULL。该值并不是“可信的”值
通过查看INNODB_LOCKS表信息后知道了锁等待是因为两个事务都往tx_bitfly表上加X锁

  • 查看INNODB_LOCK_WAITS表
mysql>  select * from information_schema.INNODB_LOCK_WAITS\G;
*************************** 1. row ***************************
requesting_trx_id: 2754
requested_lock_id: 2754:116:3:5
  blocking_trx_id: 2753
 blocking_lock_id: 2753:116:3:5
1 row in set, 1 warning (0.00 sec)

字段说明
requesting_trx_id: 申请锁资源的事务ID
requested_lock_id: 申请的锁的ID
blocking_trx_id: 阻塞的事务ID
blocking_lock_id: 阻塞的锁的ID
通过查看INNODB_LOCKS表信息后知道了事务2754申请2753事务上面的锁
因此我们可以通过分析三张表的信息来分析锁的执行情况

MVCC(多版本并发控制)

上面介绍的锁都是悲观锁,类似于java并发中的synchronize、Lock,MVCC则像乐观锁,类似于java并发中的cas,并不会对数据进行加锁,可以提高数据库的并发性

auto_increment实现使用的锁

参考
书籍:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容