读书笔记:数据库并发控制:为什么它如此重要?

读书笔记:数据库并发控制:为什么它如此重要?

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

数据库并发控制:为什么它如此重要?

并发控制:数据库的核心能力

想象一下,你正在使用一个共享的Excel表格和多位同事同时编辑。如果没有合理的控制机制,很快就会出现数据混乱——这就是数据库并发控制要解决的根本问题。

并发控制是数据库区别于普通文件系统的关键特性,也是不同数据库之间相互区分的重要标志。它确保在多用户同时访问时,数据能保持完整性和一致性。

并发问题的三大恶果

如果忽视并发控制,开发者将面临三大问题:

  1. 数据完整性被破坏:看似正常的操作在多用户环境下可能导致数据错误。
  2. 性能下降:少量用户时系统就变慢,等待时间增加。
  3. 扩展性受限:用户量增加时系统无法有效扩展。

这些问题不是"可能"发生,而是"必然"会发生。就像收费站堵车一样,当多个"车辆"(用户请求)同时到达时,如果没有良好的调度机制,整个系统就会陷入混乱。

Oracle的独特锁机制

Oracle采用了一套独特的并发控制方案:

  1. 行级锁定:只锁定被修改的行,不会升级到整张表
  2. 读不阻塞写,写不阻塞读:与许多数据库不同,Oracle的读操作不会被写操作阻塞
  3. 写写互斥:只有多个写操作同时修改同一行时才会阻塞

这种设计带来了极高的并发性能,但也需要开发者理解其特殊行为。例如,在其他数据库中依赖"读阻塞写"机制实现的业务逻辑,在Oracle中可能完全失效。

一个真实的并发问题案例

考虑一个会议室预订系统。开发者可能这样实现:

  1. 检查某个时间段是否已被预订
  2. 如果没有冲突,就插入新的预订记录

在单用户测试时一切正常。但当多个用户同时操作时,可能出现两人同时预订同一时间段的情况。这是因为Oracle的读操作不会阻塞写操作,导致并发检查都通过了。

解决方案是使用SELECT FOR UPDATE语句先锁定资源记录:

SELECT * FROM resources WHERE resource_name = '会议室A' FOR UPDATE;

这相当于在修改前先"占位",确保同一时间只有一个人能操作特定资源。

多版本控制:Oracle的秘密武器

Oracle通过多版本控制实现读一致性:

  • 每个查询看到的是特定时间点的数据快照
  • 读操作不会被写操作阻塞
  • 写操作保存旧数据版本,供其他会话读取

例如,即使数据被删除并提交,通过闪回查询仍能看到之前的数据:

-- 查看删除前的数据
SELECT * FROM emp AS OF SCN 123456;

这种机制使得Oracle能够提供高度并发的同时保证数据一致性。

给开发者的建议

  1. 不要假设所有数据库行为相同:特别是从其他数据库迁移到Oracle时
  2. 重视多用户环境测试:单用户测试发现不了并发问题
  3. 理解业务场景的并发需求:有些业务需要手动加锁
  4. 善用Oracle特有功能:如闪回查询解决特定问题

记住,99%的情况下并发控制是透明的,但那1%的特殊情况正是区分优秀开发者的关键。理解这些原理,才能写出真正健壮可靠的数据库应用。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-07-06 16:02  认真就输  阅读(13)  评论(0)    收藏  举报