锁的介绍:
范围如下:
1.兼容性:共享锁与排它锁
共享锁和排它锁是innoDB实现的标准行级锁:也就是s锁和x锁。
排它锁(x锁):可以让持有锁的事务更新或者删除一行。
共享锁(s锁):可以让持有锁的事务读取一行。
举个例子:
a.如果事务Tr1持有行r的s锁,事务Tr2请求行r的锁时会有以下处理过程:
Tr2请求行r的s锁会被允许,Tr1和Tr2都会拥有行r的s锁。
Tr2请求行r的x锁不会被允许,必须等待Tr1释放行r的s锁。
b.如果事务Tr1持有行r的x锁,事务Tr2请求行r的锁时会有以下处理过程:
Tr2请求行r的s锁或者x锁都不会被允许,必须等待Tr1释放行r的x锁。
小结:
2.加锁机制:乐观锁和悲观锁
乐观锁和悲观锁其实是对数据库数据冲突的一种态度:
乐观锁:认为数据一般不会发生冲突,只有在数据进行提交的时候才对数据冲突进行检测。如果数据发生了冲突才会进行错误信息返回,提醒用户,如果没有冲突则对数据进行提交更新。
悲观锁:认为数据一定会发生冲突,所以在数据读取的时候就数据进行加锁,加锁后其它数据将暂时不会进行修改。
区别:
乐观锁并不会对数据进行加锁,从而效率比较高,适合读操作。而悲观锁是利用数据库加锁机制对数据进行加锁,加锁后其他读取操作也要进行等待。乐观锁如果有人在之前更新了,你的更新应当是被拒绝的。悲观锁则会等待前一个更新完成。
实现:
悲观锁:依靠数据库的锁机制来实现。
乐观锁:一般根据数据库版本记录机制来实现。
3.锁的粒度:所谓粒度,即细化的程度。锁的粒度越大,则并发性越低且开销大;锁的粒度越小,则并发性高且开销小。
(1)行锁,行锁是粒度中最小的资源。行锁就是指事务在操作数据的过程中,锁定一行或多行的数据,其他事务不能同时处理这些行的数据。行级锁占用的数据资源最小,所以在事务的处理过程中,允许其它事务操作同一表的其他数据。
(2)页锁,一次锁定一页。25个行锁可升级为一个页锁。
(3)表锁,锁定整个表。当整个数据表被锁定后,其他事务就不能够使用此表中的其他数据。使用表锁可以使事务处理的数据量大,并且使用较少的系统资源。但是在使用表锁时,会延迟其他事务的等待时间,降低系统并发性。
(4)数据库锁,防止任何事务和用户对此数据库进行访问。可控制整个数据库的操作。
4.锁的模式:
记录锁:
记录锁是最简单的行锁,仅仅锁住一行;记录锁永远加在索引上,即使一个表没有索引,innoDb会隐式创建一个索引,并使用这个所以实现记录锁;会阻塞其他事务对其插入,更新,修改
Gap锁:间隙锁是一种加在两个索引之间的锁,加在第一个索引之前或者最后一个索引之后的间隙;
使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据;
间隙锁只阻止其他事务插入到间隙中,他们不阻止其他事务在同一个间隙上获取的间隙锁,所以gap x lock和 gap s lock有相同作用
next-key锁:
next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁
意向锁:
意向共享锁(IS锁):事务想要获得一张表中某几行的共享锁
意向排他锁(IX锁):事务想要获得一张表中某几行的排他锁
插入意向锁:
是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式信号,亦即多个事务在相同的索引间隙插 入时如果不是插入间隙中相同的位置就不需要互相等待。