简单说说数据库的锁和操作系统锁的区别

本文探讨了数据库事务中锁的作用,强调了日志在事务回滚中的重要性。接着分析了数据库锁的特点,与操作系统中的Latch不同,数据库锁更注重长期持有和大量使用,并遵循先来后到的获取原则。同时,介绍了悲观锁和乐观锁的概念及应用场景,说明了在并发访问时如何协调不同session的锁请求。

来自事务的需要

事务作为数据库操作的执行单位,要么全部成功,要么全部失败。
往往依赖于日志以及

日志

日志可以将操作、数据记录甚至是数据页的记录偏移和内容记录下来,便于事务的回滚。

比如在以下场景:多个client对于记录A和B的值进行更改,会首先被记录到日志模块里;日志模块会自己设计策略,安排将操作更新到磁盘的时机。(过于频繁会导致大量I/O开销,反之则数据滞后。)
在这里插入图片描述

而锁保证了数据库事务在表级、记录级的下的ACID特性。我们接下来会展开说说。

锁的特点

注意,数据库的锁与我们在操作系统里用的Latch关系不大。
试想我们给成千上万个数据记录加上几百字节的互斥锁或者共享锁的开销。
数据库的锁一般有记录级、表级、表空间级,有以下的特点:

  1. 与OS的Latch相似,写时互斥,读时共享。
  2. 持有时间会相对长(等待事务结束)。
  3. 数量庞大(一个会话可能持有成百上千的记录锁)。
  4. 每个session同一个时刻只能等待一把锁。要按照先来后到的顺序获取锁。

锁的实现原则

  1. 在数据库的本身的数据结构中实现,表锁加在表的数据结构中;记录锁加在记录的数据结构中。
  2. 每个session可能会持有非常多的锁。
  3. 每个session锁遵循先来后到的原则。

乐观锁和悲观锁

悲观锁:认为数据易被并发修改,产生冲突。因此在修改数据前先锁定数据。典型的为读锁和写锁。

乐观锁:与悲观锁相反。修改前先不锁定数据,修改完后等到要提交更新的数据再检查是否发生冲突。如果有再回滚。

锁使用的场景

下图中,session a试图获得记录C的互斥锁;
session b也试图获得记录C的互斥锁,但根据先来后到原则,它需要通过指针链到session a后。
session c也试图获得记录C的共享锁,但根据先来后到原则,它需要通过指针链到session b后。
在这里插入图片描述
session a处理完后,唤醒session b获取记录C的互斥锁。
在这里插入图片描述
此时session d请求记录C的共享锁,根据先来后到原则,它通过指针链到session c后。

在这里插入图片描述
b释放锁之后,唤醒session c和session d获取记录C的共享锁。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值