-
InnoDB下,mysql四个级别隔离下加锁操做mysql
- 四个级别隔离的写操做都加X锁
- 串行化下读加S锁
- select ... for update, select ... lock in share mode 分别加x锁,s锁
- 在须要加锁的场景下,会根据状况使用三种加锁策略(算法)
- Record Lock
- Gap Lock
- Next-Key Lock
-
mysql RR 为啥能隔离幻读算法
- 快照读 select
- 当前读 select for update, select lock in share mode, delete,insert,update
-
InnoDB提供了一致性的非锁定读、行级锁支持sql
-
Lock 与Latch数据库
- Lock 主要用于锁定数据库中的对象,如表、页、行,而Latch主要是线程并发上的资源锁定。
- Latch的实现采用了乐观spin-wait,因此在竞争比较激烈的并发环境下,性能不是很好,是一种轻量锁。
- Latch
- mutex(互斥liang)
- rwlock(读写锁)
- Lock
- 行锁、表锁、页锁
- 在没有索引的状况下,通常是锁全表的全部行,而后逐行判断解锁
- 没有实现锁升级
-
行级锁并发
- 共享锁(S Lock)
- 排他锁 (X Lock)
- S与S兼容,而X与什么都不兼容
-
意向锁(事务在更细的粒度上加锁)性能
- 意向共享锁(IS Lock) ,事务想要得到一张表中某几行的共享锁
- 意向排他锁(IX Lock),事务想要得到一张表中某几行的排他锁
- InnoDB的意向锁是表级别的锁
-
一致性的非锁定读线程
- 经过行多版本控制的方式来读取当前执行时间数据中行的数据。
- 若是当前行的X锁已经被得到,那么经过undo 段,来得到X锁被得到前的快照,返回该快照的数据
- 非锁定读,不须要X锁的释放就能够进行操做。能够等同于在事务开始时得到全局快照,在事务运行期间,不管其余事务是否对数据进行提交,都不影响。
-
一致性锁定读版本控制
- SELECT...FOR UPDATE (加X锁)
- SELECT... LOCK IN SHARE MODE (加S锁)
-
自增加与锁对象
- SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
-
外键和锁索引
- 对外键值的插入和更新的时候,须要读父表,这时不能采用一致的非锁定读,不然会出现子表与父表不一致的现象。因此须要采用一致性读,也就是给父表加S锁。
-
行锁的三种算法
- Record Lock: 单个行记录上的锁
- Gap Lock: 间隙锁,锁定一个范围,不包含记录自己
*
- Next-Key Lock: Gap Lock + Record Lock, 锁定一个范围,而且锁定记录自己
-
InnoDB经过Next-key Lock避免了幻读问题
- 经过加两个间隙锁,来保证对于insert,delete操做不会形成幻读
-
全部隔离级别都实现了写写互斥
-
四种隔离级别
- 读未提交
- 读读不互斥、读写不互斥、写写互斥(不是没有加锁!!!!)
- 读已提交(一致性的非锁定读)
- 读读不互斥、读写不互斥、写写互斥
- 每次读都是读的最新快照 (避免了脏读,经过undo log实现)
- 可重复读(一致性的非锁定读)
- 读读不互斥、读写不互斥、写写互斥
- 每次读都是事务开始时的最新快照 (避免了脏读,不可重复读, 经过undo log实现)
- 串行化
- 读读不互斥、读写互斥、写写互斥
- 读读加的是S锁
- 容易发生死锁
-
死锁