读书笔记:银行对账惊魂夜: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有个绝招叫多版本控制,就像《大话西游》里的月光宝盒:
- 当老张的查询开始时,数据库会拍下"快照"
- 即便ATM正在修改数据,查询看到的仍是快照里的旧数据
- 通过特殊的"撤销日志",能把正在修改的数据还原到查询开始时的状态
对比其他数据库的笨办法
其他数据库通常用两种方式:
- 锁全表:像在金库门口挂"盘点中"的牌子,所有人等着
- 边读边锁:像点钞时按住正在数的钞票,其他钱可以动
而Oracle的做法就像:
- 会计在查账时,出纳可以继续办理业务
- 会计通过监控回放看业务发生前的账面情况
- 双方互不干扰,效率提高十倍
真实事故案例
去年某银行就发生过:
- 新来的程序员小王用SELECT...FOR UPDATE锁表
- 月底报表运行时,整个银行系统卡死2小时
- 客户在ATM前大排长龙,行长急得跳脚
Oracle的三大绝技
- 时间旅行查询:总能回到查询开始的那个瞬间
- 穿透锁读取:像有了透视眼,能看穿正在修改的数据
- 零锁统计:算账不影响办业务,鱼和熊掌兼得
重要启示
- 不要随便用FOR UPDATE,就像不要用消防栓洗车
- 插入数据时不用担心"自拍"效应(不会看到自己刚插的数据)
- 递归SQL不会变成无限循环,结果完全可预测
下次当你看到银行系统深夜跑批处理时,就知道Oracle正在上演"时空穿梭"的好戏。这可比《信条》里的时间钳形战术更早出现,也更靠谱!
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

浙公网安备 33010602011771号