https://mp.weixin.qq.com/s?__biz=MzA5Mjg2MDQ5NQ==&mid=2452509174&idx=1&sn=600a3d3622927dd8234d6fd66f603665&scene=21#wechat_redirect
https://juejin.im/post/6871018035630342151 意向锁解析
脏读:一个事务读到另外一个事务未提交的数据(可能会回滚)
不可重复读:在同一个事务中,多次读取同一数据返回的结果不同,和脏读不同的是这里读取的是已经提交过后的
幻读:同一事务多次读,读到的结果数量不一样,因为有可能其他事务插入了一些数据正好满足你读的条件,一个事务读到另一个事务已提交的insert数据
事务隔离级别:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(RUC) | NO | NO | NO |
已提交读(RC) | YES | NO | NO |
可重复读(RR) | YES | YES | NO |
可串行化 | YES | YES | YES |
InnoDB和其他数据库有点不同,InnoDB的可重复读其实就能解决幻读了
在InnoDb中实现了两个标准的行级锁,可以简单的看为两个读写锁:;
一。S-共享锁:又叫读锁,其他事务可以加共享锁,但是不能加排它锁
二。X-排它锁:又叫写锁,一旦加了写锁后,其他事务就不能加锁
兼容性:是指事务A获得一个某行某种锁之后,事务B同样的在这个行上尝试获取某种锁,如果能立即获取,则称锁兼容,反之叫冲突
纵轴是代表已有的锁,横轴是代表尝试获取的锁。
. | X | S |
---|---|---|
X | 冲突 | 冲突 |
S | 冲突 | 兼容 |
三。意向锁
LOCK TABLE my_tabl_name READ; 用读锁锁表,会阻塞其他事务修改表数据。
LOCK TABLE my_table_name WRITe; 用写锁锁表,会阻塞其他事务读和写
意向锁在InnoDB中是表级锁,和他的名字一样他是用来表达一个事务想要获取什么。意向锁分为:
IS-意向共享锁:表达一个事务想要获取一张表中某几行的共享锁;
IX-意向排它锁:表达一个事务想要获取一张表中某几行的排它锁;
这个锁有什么用呢?为什么需要这个锁呢? 首先说一下如果没有这个锁,如果要给这个表加上表锁,一般的做法是去遍历每一行看看他是否有行锁,这样的话效率太低,而我们有意向锁,只需要判断是否有意向锁即可,不需要再去一行行的去扫描。
在InnoDB中由于支持的是行级的锁,因此InnboDB锁的兼容性可以扩展如下:
. | IX | IS | X | S |
---|---|---|---|---|
IX | 兼容 | 兼容 | 冲突 | 冲突 |
IS | 兼容 | 兼容 | 冲突 | 兼容 |
X | 冲突 | 冲突 | 冲突 | 冲突 |
S | 冲突 | 兼容 | 冲突 | 兼容 |
四,自增长锁