mysql 锁

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同样的在这个行上尝试获取某种锁,如果能立即获取,则称锁兼容,反之叫冲突

纵轴是代表已有的锁,横轴是代表尝试获取的锁。

.XS
X 冲突 冲突
S 冲突 兼容

三。意向锁

LOCK TABLE my_tabl_name READ; 用读锁锁表,会阻塞其他事务修改表数据。

LOCK TABLE my_table_name WRITe; 用写锁锁表,会阻塞其他事务读和写

意向锁在InnoDB中是表级锁,和他的名字一样他是用来表达一个事务想要获取什么。意向锁分为:

IS-意向共享锁:表达一个事务想要获取一张表中某几行的共享锁;

IX-意向排它锁:表达一个事务想要获取一张表中某几行的排它锁;

这个锁有什么用呢?为什么需要这个锁呢? 首先说一下如果没有这个锁,如果要给这个表加上表锁,一般的做法是去遍历每一行看看他是否有行锁,这样的话效率太低,而我们有意向锁,只需要判断是否有意向锁即可,不需要再去一行行的去扫描。

在InnoDB中由于支持的是行级的锁,因此InnboDB锁的兼容性可以扩展如下:

 

.IXISXS
IX 兼容 兼容 冲突 冲突
IS 兼容 兼容 冲突 兼容
X 冲突 冲突 冲突 冲突
S 冲突 兼容 冲突 兼容

四,自增长锁

 

posted @ 2020-10-29 17:07  dahuinihao  阅读(49)  评论(0编辑  收藏  举报