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

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

为什么程序员总爱"小步快跑"提交事务?这个习惯可能害了你!

大家好!今天我们来聊聊程序员在使用数据库时的一个常见坏习惯——过分热衷于"小步快跑"式的事务提交。这就像吃饭时每吃一口就擦一次嘴,看似讲究,实则效率低下还可能弄巧成拙。

不同数据库的"脾气"大不同

想象你刚从一个严格管控的学校转学过来。在原来的学校(比如SQL Server):

  • 每次发言必须举手说"老师我开始了"(BEGIN TRANSACTION)
  • 说完一句话就必须坐下(自动提交)
  • 课堂纪律严格,怕同学们互相干扰(锁资源稀缺)

而Oracle就像一所开放式大学:

  • 随时可以开始发言(隐式事务)
  • 想讲多久讲多久(根据内容需要)
  • 同学们可以自由讨论不打架(读写不阻塞)

循环提交的三大误区

很多程序员喜欢这样更新数据:

for 每一行 in 表:更新当前行if 行数%100 == 0:提交事务()

他们通常有两个看似合理的理由:

  1. "这样更快" ❌ 实际上就像快递员:
  • 一次性送完一栋楼所有包裹(单条SQL)最省时间
  • 每送一个包裹就回站点一趟(循环提交)最慢
  • 攒几件一起送(批量处理)居中
  1. "UNDO空间不够" ❌ 这就像抱怨: "我家冰箱太小,所以只能每天去超市" 正确做法是换个更大的冰箱(配置足够UNDO空间)!
  2. "系统会卡死" ❌ Oracle的锁机制很高效,不会像其他数据库那样轻易出现阻塞。

最可怕的"快照太老"错误

当你在循环中频繁提交时,可能会遇到ORA-01555错误。这就像:

  1. 你边做饭边看菜谱(查询需要一致性视图)
  2. 每做完一步就扔掉之前的操作说明(提交后UNDO空间被重用)
  3. 做到一半想回头看某步骤时——糟了!说明已经当垃圾扔掉了!

更可怕的是:

  • 你不知道哪些步骤完成了
  • 很难从中断处继续
  • 还不如一开始就完整做完整道菜再收拾(单事务完成)

给程序员的忠告

  1. 让事务保持完整:就像讲故事要有头有尾
  2. 根据业务逻辑决定提交时机:比如完成一个完整订单后再提交
  3. 给UNDO空间足够容量:别让数据库"内存不足"
  4. 简单就是美:能用单条SQL就别写复杂循环

记住:在Oracle的世界里,"大事务"不可怕,"碎事务"才危险。就像写文章,一气呵成的作品往往比不断停笔续写的更连贯优质!

希望这篇文章能帮你改掉"小步快跑"的提交习惯,让你的数据库操作既安全又高效!

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

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

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

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

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

读书笔记:为什么程序员总爱"小步快跑"提交事务?这个习惯可能害了你!_提交事务