读书笔记:银行对账惊魂夜:Oracle如何让数据"时光倒流"?

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

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

银行对账惊魂夜:Oracle如何让数据"时光倒流"?

老张是银行的系统管理员。每月底他都要统计所有账户的总余额,这个数字必须分毫不差。但就在昨晚,他遇到了诡异事件...

惊魂时刻

晚上11点,老张启动统计程序:

SELECT SUM(account_balance) FROM accounts;

与此同时,ATM正在把客户A账户的400元转给客户B。按照常理,这个总和可能会出错——如果程序读到A账户扣款前的500元,又读到B账户收款后的500元,总金额就会多算400元!

但Oracle给出的结果始终是准确的1250元。这究竟是怎么做到的?

数据库的"月光宝盒"

Oracle有个绝招叫多版本控制,就像《大话西游》里的月光宝盒:

  1. 当老张的查询开始时,数据库会拍下"快照"
  2. 即便ATM正在修改数据,查询看到的仍是快照里的旧数据
  3. 通过特殊的"撤销日志",能把正在修改的数据还原到查询开始时的状态

对比其他数据库的笨办法

其他数据库通常用两种方式:

  • 锁全表:像在金库门口挂"盘点中"的牌子,所有人等着
  • 边读边锁:像点钞时按住正在数的钞票,其他钱可以动

而Oracle的做法就像:

  • 会计在查账时,出纳可以继续办理业务
  • 会计通过监控回放看业务发生前的账面情况
  • 双方互不干扰,效率提高十倍

真实事故案例

去年某银行就发生过:

  • 新来的程序员小王用SELECT...FOR UPDATE锁表
  • 月底报表运行时,整个银行系统卡死2小时
  • 客户在ATM前大排长龙,行长急得跳脚

Oracle的三大绝技

  1. 时间旅行查询:总能回到查询开始的那个瞬间
  2. 穿透锁读取:像有了透视眼,能看穿正在修改的数据
  3. 零锁统计:算账不影响办业务,鱼和熊掌兼得

重要启示

  1. 不要随便用FOR UPDATE,就像不要用消防栓洗车
  2. 插入数据时不用担心"自拍"效应(不会看到自己刚插的数据)
  3. 递归SQL不会变成无限循环,结果完全可预测

下次当你看到银行系统深夜跑批处理时,就知道Oracle正在上演"时空穿梭"的好戏。这可比《信条》里的时间钳形战术更早出现,也更靠谱!

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

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