持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
数据库锁相关知识
前文
数据库在查询、写入等操作的过程中,由于存在并发情况下的数据处理问题,因此同样是存在锁相关的操作。本文会根据不同的分类方式对数据库锁相关的信息进行整理。文章内容主要是笔记性质的记录,可能存在不准确或错误之处。
锁的分类
根据不同的分类方式,数据库锁可以分为不同的类别。下面将根据不同的分类方式,对数据库的锁进行讨论。
根据锁的锁定范围
- 行锁:主要锁定数据库的某一行数据,行锁的效率明显比较高。
- 表锁:主要锁定某一张数据库表的数据,表锁相比于行锁由于锁定的范围较高会导致效率的降低。
- 页锁:指的是数据库的某一页的存储内容,也就是数据库表中相邻的一些数据的锁定。
根据锁的并发生效限制
- 共享锁:可以认为是读锁。当进行共享锁的锁定时,不同的数据库操作可以并发进行,但只能进行并发的读取。在发生共享锁时,所有的操作线程都不可以进行数据库数据的写入。共享锁也可以称为是读锁。
select ... lock in share mode。 - 排他锁:可以认为是写锁。对比共享锁,很明显该锁就是一个重量级锁。当进行锁定时,数据库表不能被其他线程进行读取和写入的操作。同一时刻只有一个线程能够获取到排他锁,可以成为写锁。
select ... for update。
根据锁的数据变更思想
- 乐观锁:默认认为数据不会发生变化,仅仅在数据进行提交时,会进行数据的比较。可以认为乐观锁是cas的方式,自然有比较高的效率。
- 悲观锁:乐观锁主要是认为数据会被其他线程更新,也就是需要对数据进行完全的锁定。显然,上面提到过的排他锁就是一种悲观锁,保证数据不能被其他线程处理。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。