多事务少提交,资源开销大,死锁风险也高。Oracle 的事务,COMMIT可不是想用就用的。
事务中的COMMIT
释放的不只是数据,还牵扯到回滚段、锁、redo log buffer
,资源一多,数据库压力可不小。尤其是大事务,执行时间一长,锁就容易堆起来,死锁说来就来。
我自己踩过坑,做批量更新时贪图省事,等一大批数据操作完了才COMMIT
,结果直接被 DBA 拉去喝茶。后来才明白,小事务频繁COMMIT
,反而更省资源,还更稳定。
如果你对回滚段还不太了解,可以看看这几篇文章,还挺有的:建立回滚段 Oracle 数据库创建回滚段操作、探讨 ORACLE 的回滚段、Oracle 回滚段大小对性能的影响,对理解COMMIT
释放资源的逻辑会更清楚。
哦对了,别光看 Oracle,MySQL InnoDB 日志回滚段那篇也挺有参考价值。虽然底层机制不一样,但大事务的思路是相通的。
所以建议你:事务尽量小、COMMIT
要及时。如果你正在做大数据批,最好加个判断逻辑,一定数量后就COMMIT
一次,响应也快,出错也能及时回滚。