ITPUB论坛-专业的IT技术社区

标题: 请教大家一个问题,存储过程中需要几个commit? [打印本页]

作者: yi888long    时间: 2013-12-2 15:37
标题: 请教大家一个问题,存储过程中需要几个commit?
本帖最后由 yi888long 于 2013-12-2 15:38 编辑

比如说,我有很多update和delete语句,我需要在每一个后面都commit,还是只需要在最后一行写一个commit就行了?这两者有什么区别吗?我自己试了下,好像都一样,但是不知道会不会在什么情况下有区别? 请教大家,谢谢了。。
作者: ora_苍狗    时间: 2013-12-2 15:51
如果中间有语句发生错误就不一样了,写了一个测试的例子,看看对你有帮助没有
drop table aatest;
create table aatest
(nid number,nname varchar2(16))
insert into aatest(nid,nname)values(1,'00');
commit;
create or replace procedure aatesta
as
begin
   update aatest set nname='step1' where nid=1;
   commit;
   update aatest set nname='step2' where nid=1;
   commit;
   update aatest set nname='step3_12345678910101010101' where nid=1;
   commit;
   exception when others then
     rollback;
end;
create or replace procedure aatestb
as
begin
   update aatest set nname='step1' where nid=1;
   update aatest set nname='step2' where nid=1;
   update aatest set nname='step3_12345678910101010101' where nid=1;
   commit;
   exception when others then
     rollback;
end;
作者: 〇〇    时间: 2013-12-2 15:56
一个也不写
作者: oracle_cj    时间: 2013-12-2 16:00
这个要看情况
作者: yi888long    时间: 2013-12-2 16:03
ora_苍狗 发表于 2013-12-2 15:51
如果中间有语句发生错误就不一样了,写了一个测试的例子,看看对你有帮助没有
drop table aatest;
create ...

谢谢,我理解了,如果有异常,有多个commit的语句,之前的已保存;只有最后一个的会全部回滚。但是,如果都正确的话,他们之前还有区别吗?效率什么的是不是还是用一个commit好?
作者: yi888long    时间: 2013-12-2 16:06
〇〇 发表于 2013-12-2 15:56
一个也不写

我查询的时候,也看到有些地方说一个也不写,会影响其他程序调用,但是我只是自己在数据库上更新数据,所以需要提交的。
作者: dingjun123    时间: 2013-12-2 16:19
从事务上来说,如果是单独的存储过程调用,一个commit,如果是前台语言调用存储过程,调用的语言commit..
从性能上说,如果做很多大事务,不commit,必然对undo产生冲击,可能会干爆undo...但是太频繁也不行,太频繁commit,redo受不了
从锁上说,高并发的,你多条语句如果commit一次,语句慢的话,产生锁的时间必然长,会造成其他session等待的问题。。。
所以,还是要具体问题具体分析
作者: hh7yx    时间: 2013-12-2 16:34
这个东西还是看你每个dml块  逻辑 有没有关联了?

没有啥关联,而且还是大数据操作,每个后面带个commit 蛮好。

否则,你还要考虑有关联 失败统一回滚的问题。
作者: Naldonado    时间: 2013-12-2 17:49
有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。
作者: Naldonado    时间: 2013-12-2 17:50
hh7yx 发表于 2013-12-2 16:34
这个东西还是看你每个dml块  逻辑 有没有关联了?

没有啥关联,而且还是大数据操作,每个后面带个commit ...

这个commit。我觉得最好能没有就没有。慢的话,就想办法变快,否则很蛋疼。
作者: yi888long    时间: 2013-12-2 18:07
dingjun123 发表于 2013-12-2 16:19
从事务上来说,如果是单独的存储过程调用,一个commit,如果是前台语言调用存储过程,调用的语言commit..
从 ...

谢谢兔子,每次回答,都可以让我了解其他的知识。
作者: yi888long    时间: 2013-12-2 18:08
hh7yx 发表于 2013-12-2 16:34
这个东西还是看你每个dml块  逻辑 有没有关联了?

没有啥关联,而且还是大数据操作,每个后面带个commit ...

是啊,数据量大了,的确很麻烦
作者: yi888long    时间: 2013-12-2 18:09
Naldonado 发表于 2013-12-2 17:49
有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。

谢谢回答,不过还是应该看情况吧
作者: 260600sz    时间: 2013-12-2 21:39
某种情况如:一个sp中多个dml语句,1.insert into t select ...;  commit 2. delete from t where ..;如果语句2失败,则不能保证事务的完整性,表数据t可能会有脏数据
作者: 诗意秋雨    时间: 2013-12-2 22:13
一般是在最后放一个吧,特别主要注意数据的一致性的问题


有时候在中间或者某个位置加个commit,可能是因为想释放一些由事务引起的资源,以此来提高性能......

不能随便加Commit
作者: newkid    时间: 2013-12-3 00:41
首先,要保证事务完整性,这个是大前提。如果是同一个事务绝不可在中间COMMIT。
如果是大型DML操作,且不属于同一个事务,中间提交是没有问题,但要确保你的程序在万一失败的情况下,再次运行时能否识别出已处理和未处理的数据。

作者: Joshua_q    时间: 2013-12-3 11:51
发生了错误你就不知道在哪个状态了,还是每个都写比较好。像MySQL那种可以自动提交的,出了问题就不知道在哪里了。
作者: lastwinner    时间: 2013-12-3 14:19
7# 兔子说得很全了,建议楼主仔细体会




欢迎光临 ITPUB论坛-专业的IT技术社区 (http://www.itpub.net/) Powered by Discuz! X3.2