mysql 锁概述

行锁
shared Locks 共享锁

也叫读锁

Exclusive Locks 排他锁

也叫写锁

表锁 意向锁

数据库自己维护的,使用行锁前,数据库会先给表加表锁
它并不会真正的给表加上锁,只是会加上一个标志。
主要是能让其它事务知道,表里面有数据被加锁了。不用去每一行数据看是否有锁。

意向共享锁
意向排它锁

锁到底是锁住了什么?
行 列 还是表?

锁住的就是索引,没有索引rowId的方式,全表扫描时会把所有的rowId全部锁住

无索引的情况:
表象时整张表,如上
主键索引的情况:
当然会锁住一行

辅助索引+主键索引的情况:
辅助索引和主键索引都会锁住,因为要通过辅助索引找到主键索引再来找到数据

锁定范围(区间划分):
记录锁 实际存在的主键的值(record)

    唯一性索引等值查询,精准匹配

间隙锁 由实际记录划分开的不存在数据的区间(gap)

    记录不存在时,where条件不包含任何一个存在的键值
    
    **间隙锁相互之间不冲突**

临键锁 就是左开右闭的gap(next-key)
    
**默认的锁应该是临键锁**,视情况会退化为上面的那种锁  

就是靠临键锁的方式锁住了下一个空间,这样其它事务就没法插入了。靠这个就**解决了幻读**。

事务隔离级别的实现(RR级别)

不加锁的select MVCC
DML语句和加锁的读,使用上面的三种锁

**RC下面的情况就只有record Lock**

用RC可以换来,UPDATE DELETE 没有命中索引时不锁表,UPDATE半一致性读

字符怎么排序?
ASCII码排序的

死锁(说白了就是两个事务互相等待)
锁的默认超时时间
innodb_lock_wait_timout = 50s

数据库会自动检测到死锁的发生

检测条件 图算法
1)互斥
2)不可剥夺
3)形成等待环路

infomation_schema库
INNODB_TRX表里面有所有事务的信息
INNODB_LOCKS有锁的信息

你可能感兴趣的:(mysql 锁概述)