数据库乐观和悲观锁
乐观锁
比如在数据库中设置一个版本字段,每操作一次,都会将这行对应的版本号+1,这样下次更新都会拿到最新的版本号更新,如果一个事务拿到了版本号但是更新前其他人已经将版本号升级了,那么当前事务就会更新不到这条数据。也就达到了隔离的效果
悲观锁
直接加锁,加了锁以后其他进来访问就访问不了
锁分类
读锁
select * from 表名 where id=1 lock in share mode
读锁不互斥,同一个数据多个读操作不会互斥,可以同时进行
写锁
select * from 表名 where id=1 for update
写锁互斥,操作同一个数据,其中一个给这个数据加上了写锁,那么其他的操作就只能等待,等这个操作的写锁取消了才能再进行操作。
意向锁
主要是为了针对表锁,当想要给表加锁可能还要遍历当前表每一行数据看看有没有加行锁,但是意向锁的作用就是如果当前表加了行锁就会给表加一个标识代表当前表有行锁,这时候如果要加表锁就会发现表中有行锁。
间隙锁
上图中表可以看到主键id是断断续续的,那么现在有一个场景
当前隔离级别是MySQL默认隔离界别(可重复读)。
会给主键中缺少的数据加一个锁,比如10-15中间没数据,15-20中间没数据。
所以会加一个 (10,15)、(15,20)加锁。比如id > 1 and id <= 16 for update会加一个行锁在 1-16之间,但是又因为有间隙锁 15-20.所以在 1-20中间都会加锁,这时候其他事务想要插入或者修改1-20之间的数据都是要等待上个锁释放掉
临建锁
<