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

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

数据库的"保存"与"撤销":程序员必须懂的提交与回滚原理

提交(COMMIT):数据库的保存按钮

想象你正在玩一个超长的游戏关卡,系统会不时自动存档,但真正的进度保存需要你手动点击"保存"按钮。Oracle的提交机制就很像这个场景。

为什么大事务提交也不慢?

Oracle提交操作有个神奇特性:无论你修改了1条数据还是100万条,提交所需时间几乎相同。这是因为:

  1. 后台自动准备:就像游戏自动在后台存档,Oracle在修改数据时就已经准备好了提交所需的大部分工作
  2. 真正提交时只需做三件事:
  • 打个时间戳(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秒

关键发现:回滚需要逆向执行所有操作,相当于把走过的路倒着重走一遍,自然越长的路耗时越多。

三个常见误区
  1. 把普通表当草稿纸:先塞数据再回滚,既浪费写入时间又浪费删除时间
  2. 过度使用回滚:就像总用"撤销"功能,不如一开始就做对
  3. 害怕大事务:其实Oracle处理大事务提交很高效,该用就用

给程序员的黄金法则

  1. 按业务逻辑提交:完成一个完整业务操作(如生成完整订单)后再提交
  2. 减少无谓提交:别像游戏菜鸟那样走两步就存档
  3. 慎用回滚:设计时就考虑清楚,避免事后"后悔"
  4. 临时数据用临时表:Oracle有专门的临时表机制,用完自动清理

记住:数据库就像精密的赛车,了解它的"油门"(提交)和"刹车"(回滚)特性,才能开出最佳性能!

------------------作者介绍-----------------------

姓名:黄廷忠 现就职:Oracle中国高级服务团队 曾就职:OceanBase、云和恩墨、东方龙马等 电话、微信、QQ:18081072613

个人博客: (http://www.htz.pw)

CSDN地址: (https://blog.csdn.net/wwwhtzpw)

博客园地址: (https://www.cnblogs.com/www-htz-pw)

读书笔记:数据库的"保存"与"撤销":程序员必须懂的提交与回滚原理_数据