数据库中五把大锁具体指的是哪五把?
- 内容介绍
- 文章标签
- 相关推荐
在数据库的并发控制中。常被称为“**五把大锁**”的锁类型是保障数据一致性与隔离性的主要工具。掌握它们的工作原理、适用场景还有如何避免常见痛点,能明显提高程序的并发处理能力和整体稳定性。
一、共享锁
共享锁。又称读锁,允许多个事务同时读取同一资源,但不允许有事务获取排他锁。它是实现读多写少场景下高并发的关键手段。
- 适用场景: 大量读取操作,几乎不涉及写入时使用。
- 痛点: 如果读操作频繁且数据行很大。可能导致大量共享锁争抢,进而影响后续写操作的执行。
- 常用方法: 在高并发读取环境下使用行级共享锁,而非表级共享锁;合理设置隔离级别,避免不必要的加锁。
二、排他锁
排他锁。也叫写锁,只能被单个事务持有。它阻止其他事务对该资源进行任何形式的访问,从而保证修改操作的原子性。
- 适用场景: 更新、删除或插入操作需要保证数据完整性时使用。
- 痛点: 长时间持有排他锁会导致其他事务等待,甚至出现死锁;当多个事务竞争同一行时排他锁容易成为性能瓶颈。
- 常用方法: 尽量缩短事务时间;使用更细粒度的行级排他锁;结合行级或页级索引调整查询方法。
三、升级/降级锁
锁
锁用于将已持有的共享锁转换为排他锁,以便在读取后立即执行写操作。它通过释放共享资源来避免死循环等待。老实说,
- 痛点: 升级过程如果没有及时完成。可能触发死路现象,也会增加程序负担,因为必须检查是否存在其他共享持有者。
- 常用方法: 在需要先读再改时先尝试获取意向排他或意向共享,再请求升级;采用乐观并发控制减少升级需求。
降级锁
降级从排他转为共享。用于在完成写入后继续读取同一资源,以降低对其他事务的阻塞程度。
- 痛点`—` 降级失败可能导致写后仍保持高权限。从而抑制其他读取,提高响应延迟。` `—` 锁释放顺序错误容易造成脏读或不可重复读。 ` `
痛點: 若事務過多但只對少數行加鎖,頻繁設置與釋放意向鎖會增加管理開銷;且不同 DBMS 的實現差異大,導致跨网站移植時難以預測。
`
頁鎖介於行級與表級之間,是對整個資料頁面進行加鎖。在大多數 OLTP 環境中。頁鎖比行鎖更省資源,但可能導致較大的競爭窗口。行鎖則針對單條資料列,可最大化併發度,但管理成本較高。 ` / p>
`
` / ul>
`
- "讀寫競爭激烈": 在一個線上交易系統中,同時有大量客戶下單和查詢餘額。使用表級共有/排他鎖導致查詢卡頓。至于解決方法,改為使用索引覆蓋查詢 + 行級共有/排他 + 設定 READ COMMITTED 隔離級別。老实说,
"頻繁死結":
多個訂單處理服務同時更新不同商品庫存。並發提交順序不確定,引發互相等待。至于解決方法,採用「排序」策略即所有服務按照商品 ID 升序獲取編號,再更新;或者使用樂觀並發控制,按理说,
"長時間交易未提交":
`
。在数据库的并发控制中。常被称为“**五把大锁**”的锁类型是保障数据一致性与隔离性的主要工具。掌握它们的工作原理、适用场景还有如何避免常见痛点,能明显提高程序的并发处理能力和整体稳定性。
一、共享锁
共享锁。又称读锁,允许多个事务同时读取同一资源,但不允许有事务获取排他锁。它是实现读多写少场景下高并发的关键手段。
- 适用场景: 大量读取操作,几乎不涉及写入时使用。
- 痛点: 如果读操作频繁且数据行很大。可能导致大量共享锁争抢,进而影响后续写操作的执行。
- 常用方法: 在高并发读取环境下使用行级共享锁,而非表级共享锁;合理设置隔离级别,避免不必要的加锁。
二、排他锁
排他锁。也叫写锁,只能被单个事务持有。它阻止其他事务对该资源进行任何形式的访问,从而保证修改操作的原子性。
- 适用场景: 更新、删除或插入操作需要保证数据完整性时使用。
- 痛点: 长时间持有排他锁会导致其他事务等待,甚至出现死锁;当多个事务竞争同一行时排他锁容易成为性能瓶颈。
- 常用方法: 尽量缩短事务时间;使用更细粒度的行级排他锁;结合行级或页级索引调整查询方法。
三、升级/降级锁
锁
锁用于将已持有的共享锁转换为排他锁,以便在读取后立即执行写操作。它通过释放共享资源来避免死循环等待。老实说,
- 痛点: 升级过程如果没有及时完成。可能触发死路现象,也会增加程序负担,因为必须检查是否存在其他共享持有者。
- 常用方法: 在需要先读再改时先尝试获取意向排他或意向共享,再请求升级;采用乐观并发控制减少升级需求。
降级锁
降级从排他转为共享。用于在完成写入后继续读取同一资源,以降低对其他事务的阻塞程度。
- 痛点`—` 降级失败可能导致写后仍保持高权限。从而抑制其他读取,提高响应延迟。` `—` 锁释放顺序错误容易造成脏读或不可重复读。 ` `
痛點: 若事務過多但只對少數行加鎖,頻繁設置與釋放意向鎖會增加管理開銷;且不同 DBMS 的實現差異大,導致跨网站移植時難以預測。
`
頁鎖介於行級與表級之間,是對整個資料頁面進行加鎖。在大多數 OLTP 環境中。頁鎖比行鎖更省資源,但可能導致較大的競爭窗口。行鎖則針對單條資料列,可最大化併發度,但管理成本較高。 ` / p>
`
` / ul>
`
- "讀寫競爭激烈": 在一個線上交易系統中,同時有大量客戶下單和查詢餘額。使用表級共有/排他鎖導致查詢卡頓。至于解決方法,改為使用索引覆蓋查詢 + 行級共有/排他 + 設定 READ COMMITTED 隔離級別。老实说,
"頻繁死結":
多個訂單處理服務同時更新不同商品庫存。並發提交順序不確定,引發互相等待。至于解決方法,採用「排序」策略即所有服務按照商品 ID 升序獲取編號,再更新;或者使用樂觀並發控制,按理说,
"長時間交易未提交":
`
。
