锁简介

69 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

索引和锁是数据库中非常重要的两个功能。其中事务的不同隔离级别都是通过锁来实现的。加锁是为了保证数据的一致性,锁是一种非常重要的思想,它能保证多个进程对数据的访问时数据的完整性和一致性。

锁按照不同的角度,可以进行不同的类别划分。

从锁定对象的粒度来分,可以分为行锁、页锁、表锁。顾名思义,行锁就是只锁定表的某一行,这样锁定的粒度小,发生冲突的概率就低,可以实现较高的并发,但是这样的话性能开销比较大,加锁慢。页锁就是锁定某一页,表锁就是对整个表进行加锁,性能开销依次下降,但冲突概率提高,并发量低。

需要注意的是不同的数据库对不同粒度的锁的支持是有限的,比如mysql不支持页锁。另外锁占用内容,有数量限制,如果数量超出,就会进行锁升级,即从小粒度锁升级为大粒度锁。

从数据管理的角度来看,锁可以分为共享锁和排它锁。共享锁也叫读锁,即锁定的资源可以被其它的进程读取,但是不能修改。操作命令为: LOCK Table a READ; 可用下面的命令进行解锁: UNLOCK TABLE; 排它锁也叫独占锁或者写锁,它锁定的数据只允许进行锁定操作的事务使用,其他的事务查询或者修改都不行。操作命令为: LOCK Table a WRITE。

当我们进行数据更新的时候,数据库也会自动进行加锁操作,加的就是排它锁。

共享锁会发生死锁的情况,死锁就是互相等待,但是彼此都锁住了谁都无法进行到下一步。

从程序猿的角度来看,锁分为乐观锁和悲观锁。乐观锁就是认为对同一数据的并发操作不会发生,通过程序实现即可,没必要数据库加锁;悲观锁认为并发难以避免,需要数据库加锁。