数据库的锁机制
按锁类型划分,可分为共享锁、排他锁
按锁的粒度划分,可分为表级锁、行级锁、页级锁
按使用机制划分,可分为乐观锁、悲观锁
1、按锁类型划分,可分为共享锁、排他锁
共享锁(也叫写锁、S锁):多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页读取完毕,S锁立即被释放。在执行select语句的时候需要给操作对象(表或者一些记录 )加上共享锁,但加锁之前需要检查是否有排他锁,如果没有,则可以加共享锁(一个对象上可以加n个共享锁),否则不行。共享锁通常在执行完select语句之后被释放,当然也有可能是在事务结束(包括正常结束和异常结束)的时候被释放,主要取决于数据库所设置的事务隔离级别。
排他锁(也叫写锁、X锁):仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该锁页进行访问;X锁一直到事务结束才能被释放。执行insert、update、delete语句的时候需要给操作的对象加排他锁,在加排他锁之前必须确认该对象上没有其他任何锁,一旦加上排他锁之后,就不能再给这个对象加其他任何锁。排他锁的释放通常是在事务结束的时候(当然也有例外,就是在数据库事务隔离级别被设置成Read Uncommitted(读未提交数据)的时候,这种情况下排他锁会在执行完更新操作之后被释放,而不是在事务结束的时候)。
2、按锁的粒度划分,可分为表级锁、行级锁、页级锁
表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作。如果你是写锁,则其他进程读也不允许。特点是:开销小、加锁快,不会出现死锁。锁定粒度最大,发生锁冲突的概率最高,并发度最低。
MYISAM存储引擎采用的就是表级锁。
行级锁:仅对指定的记录进行加锁,这样其他进程还是可以对同一个表中的其他记录进行操作。特点:开销大,加锁慢,会出现死锁。锁定的粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。
页级锁:一次锁定相邻的一组记录。开销和加锁时间介于表级锁和行级锁之间;会出现死锁;锁定粒度也介于表级锁和行级锁之间,并发度一般。
3、按使用机制划分,可分为乐观锁、悲观锁
————————————————
版权声明:本文为CSDN博主「Tiger--Chen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21993785/article/details/81077318
网友评论