多事务少提交,资源开销大,死锁风险也高。Oracle 的事务,COMMIT可不是想用就用的。

事务中的COMMIT释放的不只是数据,还牵扯到回滚段、锁、redo log buffer,资源一多,数据库压力可不小。尤其是大事务,执行时间一长,锁就容易堆起来,死锁说来就来。

我自己踩过坑,做批量更新时贪图省事,等一大批数据操作完了才COMMIT,结果直接被 DBA 拉去喝茶。后来才明白,小事务频繁COMMIT,反而更省资源,还更稳定。

如果你对回滚段还不太了解,可以看看这几篇文章,还挺有的:建立回滚段 Oracle 数据库创建回滚段操作探讨 ORACLE 的回滚段Oracle 回滚段大小对性能的影响,对理解COMMIT释放资源的逻辑会更清楚。

哦对了,别光看 Oracle,MySQL InnoDB 日志回滚段那篇也挺有参考价值。虽然底层机制不一样,但大事务的思路是相通的。

所以建议你:事务尽量小、COMMIT要及时。如果你正在做大数据批,最好加个判断逻辑,一定数量后就COMMIT一次,响应也快,出错也能及时回滚。