您的位置:首页 > 数据库

[PL/SQL] 请教大家一个问题,存储过程中需要几个commit?

2015-12-24 10:56 411 查看
查看: 10357|回复: 17
收藏







[PL/SQL] 请教大家一个问题,存储过程中需要几个commit? [复制链接]

yi888long





注册会员

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6

论坛徽章:
3







加好友

发消息

电梯直达


1#


发表于
2013-12-2 15:37:21 |只看该作者 |倒序浏览

本帖最后由 yi888long 于 2013-12-2 15:38 编辑

比如说,我有很多update和delete语句,我需要在每一个后面都commit,还是只需要在最后一行写一个commit就行了?这两者有什么区别吗?我自己试了下,好像都一样,但是不知道会不会在什么情况下有区别? 请教大家,谢谢了。。
存储, commit, update, delete, 语句
相关帖子

本版精华

【大话IT】求救!delete where 删除数据慢

【讨论】请教一个SQL语句的问题

【讨论】请教,LINUX RAC,共享存储的盘符不一致,有无影响?

使用道具 举报

ora_苍狗





注册会员

精华贴数
0
专家积分
8
技术积分
522
社区积分
1250
注册时间
2011-3-29

论坛徽章:
22





加好友

发消息

2#


发表于
2013-12-2 15:51:22 |只看该作者

如果中间有语句发生错误就不一样了,写了一个测试的例子,看看对你有帮助没有

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;
1.上了itpub我才知道自己错过了什么,才知道自己是多么的无知

2.人类一思考,上帝就发笑

3.很喜欢这句话,借用一下:压力不是有人比你努力,是比你牛叉几倍的人依然比你努力。
使用道具 举报

〇〇





版主

精华贴数
14
专家积分
2339
技术积分
102456
社区积分
23183
注册时间
2008-1-16

论坛徽章:
362

























加好友

发消息

3#


发表于
2013-12-2 15:56:19 |只看该作者

一个也不写
使用道具 举报

oracle_cj





注册会员

Jason

精华贴数
0
专家积分
293
技术积分
8396
社区积分
7574
注册时间
2013-6-30

论坛徽章:
466















加好友

发消息

4#


发表于
2013-12-2 16:00:26 来自手机 |只看该作者

这个要看情况


使用道具 举报

yi888long





注册会员

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6

论坛徽章:
3







加好友

发消息

5#


发表于
2013-12-2 16:03:30 |只看该作者

ora_苍狗 发表于 2013-12-2 15:51



如果中间有语句发生错误就不一样了,写了一个测试的例子,看看对你有帮助没有

drop table aatest;

create ...

谢谢,我理解了,如果有异常,有多个commit的语句,之前的已保存;只有最后一个的会全部回滚。但是,如果都正确的话,他们之前还有区别吗?效率什么的是不是还是用一个commit好?
使用道具 举报

yi888long





注册会员

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6

论坛徽章:
3







加好友

发消息

6#


发表于
2013-12-2 16:06:19 |只看该作者

〇〇 发表于 2013-12-2 15:56



一个也不写

我查询的时候,也看到有些地方说一个也不写,会影响其他程序调用,但是我只是自己在数据库上更新数据,所以需要提交的。
使用道具 举报

dingjun123





版主

djゆoracle

精华贴数
25
专家积分
1931
技术积分
47675
社区积分
63533
注册时间
2006-7-28

论坛徽章:
1088

























加好友

发消息

7#


发表于
2013-12-2 16:19:25 |只看该作者

从事务上来说,如果是单独的存储过程调用,一个commit,如果是前台语言调用存储过程,调用的语言commit..

从性能上说,如果做很多大事务,不commit,必然对undo产生冲击,可能会干爆undo...但是太频繁也不行,太频繁commit,redo受不了

从锁上说,高并发的,你多条语句如果commit一次,语句慢的话,产生锁的时间必然长,会造成其他session等待的问题。。。

所以,还是要具体问题具体分析
My BLOG: http://blog.chinaunix.net/uid/7655508.html

ORACLE是个分外妖娆的女人,她总能勾起你的欲望,去探索她!

--BY DJ

About me:optimistic,passionate and harmonious

focus on oracle sql and plsql programming,peformance tuning,db design, j2ee,Linux/AIX,web2.0 tech,etc









使用道具 举报

hh7yx





注册会员

跟着老婆学Oracle

精华贴数
0
专家积分
152
技术积分
4352
社区积分
7216
注册时间
2012-12-25

认证徽章



论坛徽章:
335

























加好友

发消息

8#


发表于
2013-12-2 16:34:46 |只看该作者

这个东西还是看你每个dml块 逻辑 有没有关联了?

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

否则,你还要考虑有关联 失败统一回滚的问题。
不管你水平如何,要想写好sql语句,善于提问的重要性与查询本身的重要性几乎是相当的。




使用道具 举报

Naldonado





版主

精华贴数
0
专家积分
94
技术积分
3830
社区积分
156
注册时间
2012-6-5

认证徽章



论坛徽章:
120

























加好友

发消息

9#


发表于
2013-12-2 17:49:34 |只看该作者

有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。
对现状不满,只能不断加强自己!随时准备上场!
使用道具 举报

Naldonado





版主

精华贴数
0
专家积分
94
技术积分
3830
社区积分
156
注册时间
2012-6-5

认证徽章



论坛徽章:
120

























加好友

发消息

10#


发表于
2013-12-2 17:50:54 |只看该作者

hh7yx 发表于 2013-12-2 16:34



这个东西还是看你每个dml块 逻辑 有没有关联了?

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

这个commit。我觉得最好能没有就没有。慢的话,就想办法变快,否则很蛋疼。
对现状不满,只能不断加强自己!随时准备上场!
使用道具 举报



楼主: yi888long
收藏







[PL/SQL] 请教大家一个问题,存储过程中需要几个commit? [复制链接]

yi888long





注册会员

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6

论坛徽章:
3







加好友

发消息

11#


发表于
2013-12-2 18:07:44 |只看该作者

dingjun123 发表于 2013-12-2 16:19



从事务上来说,如果是单独的存储过程调用,一个commit,如果是前台语言调用存储过程,调用的语言commit..

从 ...

谢谢兔子,每次回答,都可以让我了解其他的知识。

使用道具 举报

yi888long





注册会员

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6

论坛徽章:
3







加好友

发消息

12#


发表于
2013-12-2 18:08:14 |只看该作者

hh7yx 发表于 2013-12-2 16:34



这个东西还是看你每个dml块 逻辑 有没有关联了?

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

是啊,数据量大了,的确很麻烦
使用道具 举报

yi888long





注册会员

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6

论坛徽章:
3







加好友

发消息

13#


发表于
2013-12-2 18:09:05 |只看该作者

Naldonado 发表于 2013-12-2 17:49



有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。

谢谢回答,不过还是应该看情况吧
使用道具 举报

260600sz





注册会员

精华贴数
0
专家积分
8
技术积分
1110
社区积分
6
注册时间
2013-4-6

论坛徽章:
4









加好友

发消息

14#


发表于
2013-12-2 21:39:37 |只看该作者

某种情况如:一个sp中多个dml语句,1.insert into t select ...; commit 2. delete from t where ..;如果语句2失败,则不能保证事务的完整性,表数据t可能会有脏数据
使用道具 举报

诗意秋雨





注册会员

求职 : ERP实施

精华贴数
0
专家积分
1
技术积分
380
社区积分
66
注册时间
2010-12-9

论坛徽章:
9



















加好友

发消息

15#


发表于
2013-12-2 22:13:35 |只看该作者

一般是在最后放一个吧,特别主要注意数据的一致性的问题

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

不能随便加Commit
使用道具 举报

newkid





版主

资深新手

精华贴数
27
专家积分
1880
技术积分
51369
社区积分
275
注册时间
2004-6-26

论坛徽章:
334

























加好友

发消息

16#


发表于
2013-12-3 00:41:57 |只看该作者

首先,要保证事务完整性,这个是大前提。如果是同一个事务绝不可在中间COMMIT。

如果是大型DML操作,且不属于同一个事务,中间提交是没有问题,但要确保你的程序在万一失败的情况下,再次运行时能否识别出已处理和未处理的数据。















世界上只有两种编程方法:Oracle的方法和错误的方法。

剑破冰山—Oracle开发艺术 即将隆重推出

http://www.china-pub.com/197199

http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=10114321

使用道具 举报

Joshua_q





注册会员

精华贴数
0
专家积分
18
技术积分
694
社区积分
0
注册时间
2012-9-25

论坛徽章:
7















加好友

发消息

17#


发表于
2013-12-3 11:51:31 |只看该作者

发生了错误你就不知道在哪个状态了,还是每个都写比较好。像MySQL那种可以自动提交的,出了问题就不知道在哪里了。
http://www.cnblogs.com/wingsless/
QQ:893286870
使用道具 举报

lastwinner





版主

路边野花不要,踩!

招聘 : 系统分析师

精华贴数
25
专家积分
1890
技术积分
73721
社区积分
32905
注册时间
2002-11-27

论坛徽章:
467

























加好友

发消息

18#


发表于
2013-12-3 14:19:21 |只看该作者

7# 兔子说得很全了,建议楼主仔细体会
剑破冰山——Oracle开发艺术,数据库开发的良师益友!订购地址:china-pub | 华储

【开发人员福利】招聘SQL审核优化高工(云和恩墨)

春困秋乏夏盹冬眠年年如此 CopyRight
By lastwinner@ITPUB.NET 2002-2015

数据挖掘
使用道具 举报

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: