是否需要在存储过程中写commit主要要依据需求:
(1) 如果是不需要在存储过程中进行提交,而是由调用程序负责提交或者回滚,那么不需要在存储过程中commit或者rollback.毕竟spring框架已经可以帮助我们自动实现事务的控制;
(2) 如果不想由调用程序负责提交或者回滚,那么就应该在存储过程中进行commit或rollback;
另外,如果是纯后台数据库开发,一定要写.只是写的时机同样是分为两种,一种是写在过程里面;另一种是写在调用存储过程之后.
而之所以要写commit的原因是,Oracle的默认事务级别是READ COMMITED;默认情况下,Oracle是不会自动提交的,需要手动提交才ok.
注意:
并不是每个INSERT/UPDATE语句后都需要COMMIT一次.因为数据量很大的话,这样效率会很差.而每次执行完十几万条INSERT/UPDATE后做一次COMMIT,也是不可取的;
比较习惯用的方法是:每做完5000条或者1w条,或者2w条,做一次COMMIT,效率一定比“每个INSERT/UPDATE语句后都COMMIT一次”快。但是具体5000条快,还是1w条快,还是2w条快,需要根据业务需求确定一个合适的量。
所以,如果使用游标的话,可以通过设置变量的方法,来实现每处理一定的行数后手动commit提交事务.
参考链接:
(1) 存储过程里使用Commit的火候
(2) ORACLE数据库事务隔离级别