我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
数据库的"保存"与"撤销":程序员必须懂的提交与回滚原理
提交(COMMIT):数据库的保存按钮
想象你正在玩一个超长的游戏关卡,系统会不时自动存档,但真正的进度保存需要你手动点击"保存"按钮。Oracle的提交机制就很像这个场景。
为什么大事务提交也不慢?
Oracle提交操作有个神奇特性:无论你修改了1条数据还是100万条,提交所需时间几乎相同。这是因为:
- 后台自动准备:就像游戏自动在后台存档,Oracle在修改数据时就已经准备好了提交所需的大部分工作
- 真正提交时只需做三件事:
- 打个时间戳(SCN编号)
- 确保操作记录写入日志文件(这是真正的保存时刻)
- 解锁让其他人可以修改这些数据
实测:频繁提交的代价
我们做了一个实验,插入10万条数据,比较不同提交频率的耗时:
提交频率 | 总耗时 | 其中等待日志写入时间 |
每1条提交 | 36秒 | 35秒 |
每100条提交 | 5秒 | 4秒 |
一次性提交 | 1.6秒 | 0秒 |
血泪教训:就像打游戏时每走一步就暂停保存,频繁提交会让数据库"手忙脚乱",大部分时间都花在等待保存确认上!
特别提示:PL/SQL的"聪明"提交
PL/SQL有个特殊优化:代码中的多次提交会"攒着"等程序结束时一起处理。但这就像把作业拖到最后一天写——不是好习惯!最佳实践仍然是:完成一个完整业务操作后再提交。
回滚(ROLLBACK):昂贵的后悔药
如果说提交是保存进度,那么回滚就是读档重来。但Oracle的回滚操作有个特点:修改越多,回滚越慢。
回滚的真实代价
我们测试了回滚不同数据量的耗时:
回滚数据量 | 耗时 |
10条 | 0.01秒 |
1万条 | 0.02秒 |
10万条 | 0.92秒 |
100万条 | 1.21秒 |
关键发现:回滚需要逆向执行所有操作,相当于把走过的路倒着重走一遍,自然越长的路耗时越多。
三个常见误区
- 把普通表当草稿纸:先塞数据再回滚,既浪费写入时间又浪费删除时间
- 过度使用回滚:就像总用"撤销"功能,不如一开始就做对
- 害怕大事务:其实Oracle处理大事务提交很高效,该用就用
给程序员的黄金法则
- 按业务逻辑提交:完成一个完整业务操作(如生成完整订单)后再提交
- 减少无谓提交:别像游戏菜鸟那样走两步就存档
- 慎用回滚:设计时就考虑清楚,避免事后"后悔"
- 临时数据用临时表:Oracle有专门的临时表机制,用完自动清理
记住:数据库就像精密的赛车,了解它的"油门"(提交)和"刹车"(回滚)特性,才能开出最佳性能!
------------------作者介绍-----------------------
姓名:黄廷忠 现就职:Oracle中国高级服务团队 曾就职:OceanBase、云和恩墨、东方龙马等 电话、微信、QQ:18081072613
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)