行锁
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有锁的信息
网友评论