Mysql锁一(白话文)
锁
锁的分类有很多,其实就是用C语言写了代码逻辑,比如:
当你执行SELECT...FORUPDATE时// 极简伪代码if(内存中的锁标志==0){内存中的锁标志=1;// 加锁成功执行你的SQL;}else{将当前线程挂起(睡眠),放入等待队列;}不同的锁,实现的代码逻辑不一样罢了
锁的分类(Innodb引擎)
1.按粒度分类:行级锁、表级锁
2.按属性:共享锁(S锁)、排它锁(X锁)
3.按状态:意向共享锁、意向排它锁
4.按算法:间隙锁、记录锁、临键锁
5.按模式:乐观锁、悲观锁
附上一个图:全局锁和页级锁是MyISAM引起的
锁的介绍
表级锁:如果查询条件没有用到索引(或者索引失效),InnoDB 会锁住整张表的所有行(实际是锁住所有聚簇索引记录),相当于表锁。
行级锁:行级锁并不是直接锁记录,而是锁索引
共享锁\排它锁:①一个是可一起读不能改②一个是不能读也不能改
意向共享锁\排它锁:它的作用是在表级别标记“即将要加行锁意向共享\排它”,不然如果要加表锁,需要遍历全表看一看有没有行要加表锁
间隙锁+记录锁=临键锁:
1)间隙锁:锁住一个间隙,但是数据可以更改
2)记录锁:锁命中的那行记录
3)临键锁:锁住之间的记录不能插入,删除,修改乐观锁和悲观锁:这两个是代码思想,①一个乐观认为没人动我的数据,不加锁,使用版本号验证是否有人动过我的数据;②一个悲观的认为我的数据一定会被动,先加锁。
总结:想也能想出来,不加锁并发高,适用多读少改;加锁并发低,适用多改少读
使用场景和优缺点自己ai一下
总结
了解mysql锁机制,下一篇介绍
1)分布式中,如何保证数据一致性
2)分布式中,跨库ACID如何保证
3)分布式中,读写不一致(刚写入的数据读不到)
4)分布式中,数据冲突(谁的数据是对的?)
想了解的任意内容打在评论区,一起讨论
