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

查看:  10357 | 回复:  17
收藏  打印  上一主题  下一主题

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

   

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6
论坛徽章:
3
2013年新春福章日期:2013-02-25 14:51:24 喜羊羊日期:2015-03-04 14:54:42 2015年新春福章日期:2015-03-06 11:59:47
跳转到指定楼层
1#
  发表于 2013-12-2 15:37:21  | 只看该作者  | 倒序浏览
本帖最后由 yi888long 于 2013-12-2 15:38 编辑

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

精华贴数
0
专家积分
8
技术积分
522
社区积分
1250
注册时间
2011-3-29
论坛徽章:
22
问答徽章日期:2013-11-05 21:18:30 马上有房日期:2014-08-05 10:50:02
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
奥迪日期:2013-08-13 17:48:11 宝马日期:2013-11-22 20:41:54 雪佛兰日期:2013-12-04 20:30:02 阿斯顿马丁日期:2014-01-03 13:53:52 兰博基尼日期:2013-12-15 15:36:43 优秀写手日期:2013-12-18 09:29:08 明星写手日期:2014-01-01 06:00:11 奔驰日期:2014-01-01 17:02:29 雪佛兰日期:2014-01-02 16:32:52 法拉利日期:2014-01-23 19:07:31 比亚迪日期:2014-01-24 11:56:57 现代日期:2014-01-17 13:01:04
3#
  发表于 2013-12-2 15:56:19  | 只看该作者
一个也不写
 
 
   

注册会员

Jason

精华贴数
0
专家积分
293
技术积分
8396
社区积分
7574
注册时间
2013-6-30
论坛徽章:
466
秀才日期:2015-11-30 09:13:06 秀才日期:2015-11-30 09:59:23 秀才日期:2015-12-14 14:47:54 秀才日期:2015-12-14 14:51:16 秀才日期:2015-12-14 15:09:38 秀才日期:2015-12-18 09:28:57 秀才日期:2015-12-21 09:53:46
4#
  发表于 2013-12-2 16:00:26  来自手机  | 只看该作者
这个要看情况
 
   

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6
论坛徽章:
3
2013年新春福章日期:2013-02-25 14:51:24 喜羊羊日期:2015-03-04 14:54:42 2015年新春福章日期:2015-03-06 11:59:47
5#
  发表于 2013-12-2 16:03:30  | 只看该作者
ora_苍狗 发表于 2013-12-2 15:51 
如果中间有语句发生错误就不一样了,写了一个测试的例子,看看对你有帮助没有
drop table aatest;
create ...

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

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6
论坛徽章:
3
2013年新春福章日期:2013-02-25 14:51:24 喜羊羊日期:2015-03-04 14:54:42 2015年新春福章日期:2015-03-06 11:59:47
6#
  发表于 2013-12-2 16:06:19  | 只看该作者
〇〇 发表于 2013-12-2 15:56 
一个也不写

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

版主

djゆoracle

精华贴数
25
专家积分
1931
技术积分
47675
社区积分
63533
注册时间
2006-7-28
论坛徽章:
1088
金色在线徽章日期:2007-04-25 04:02:08 金色在线徽章日期:2007-06-29 04:02:43 金色在线徽章日期:2007-03-11 04:02:02 在线时间日期:2007-04-11 04:01:02 在线时间日期:2007-04-12 04:01:02 在线时间日期:2007-03-07 04:01:02 2008版在线时间日期:2010-05-01 00:01:15 2008版在线时间日期:2011-05-01 00:01:34 2008版在线时间日期:2008-06-03 11:59:43 ITPUB年度最佳技术原创精华奖日期:2013-03-22 13:18:30 ITPUB年度最佳技术原创精华奖日期:2012-03-13 17:12:05 ITPUB年度最佳技术原创精华奖日期:2011-04-08 18:37:54
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



 
   

注册会员

跟着老婆学Oracle

精华贴数
0
专家积分
152
技术积分
4352
社区积分
7216
注册时间
2012-12-25
认证徽章
论坛徽章:
335
生肖徽章:虎日期:2014-02-20 16:16:15 生肖徽章:龙日期:2014-02-20 16:16:15 生肖徽章:龙日期:2014-07-21 11:42:12 生肖徽章:龙日期:2014-07-21 11:42:12 生肖徽章:龙日期:2014-07-03 16:23:55 生肖徽章:龙日期:2014-07-22 11:17:43 生肖徽章2007版:虎日期:2014-06-23 20:42:17 生肖徽章2007版:龙日期:2014-02-20 16:15:47 生肖徽章2007版:龙日期:2014-06-14 23:31:23 生肖徽章2007版:龙日期:2014-07-22 12:29:19 生肖徽章2007版:龙日期:2014-02-20 16:15:47 生肖徽章2007版:龙日期:2014-06-23 20:17:04
8#
  发表于 2013-12-2 16:34:46  | 只看该作者
这个东西还是看你每个dml块  逻辑 有没有关联了?

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

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

精华贴数
0
专家积分
94
技术积分
3830
社区积分
156
注册时间
2012-6-5
认证徽章
论坛徽章:
120
切尔西日期:2014-01-15 11:53:06 SQL极客日期:2013-12-09 14:13:35 SQL大赛参与纪念日期:2013-12-06 14:03:45 最佳人气徽章日期:2015-03-19 09:44:03 版主1段日期:2015-08-26 02:10:00 现任管理团队成员日期:2015-08-26 02:10:00 秀才日期:2015-07-28 09:12:12 举人日期:2015-07-13 15:30:15 进士日期:2015-07-28 09:12:58 探花日期:2015-07-28 09:12:58 榜眼日期:2015-08-18 09:48:03 状元日期:2015-08-18 09:48:03
9#
  发表于 2013-12-2 17:49:34  | 只看该作者
有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。
对现状不满,只能不断加强自己!随时准备上场!
 
   

精华贴数
0
专家积分
94
技术积分
3830
社区积分
156
注册时间
2012-6-5
认证徽章
论坛徽章:
120
切尔西日期:2014-01-15 11:53:06 SQL极客日期:2013-12-09 14:13:35 SQL大赛参与纪念日期:2013-12-06 14:03:45 最佳人气徽章日期:2015-03-19 09:44:03 版主1段日期:2015-08-26 02:10:00 现任管理团队成员日期:2015-08-26 02:10:00 秀才日期:2015-07-28 09:12:12 举人日期:2015-07-13 15:30:15 进士日期:2015-07-28 09:12:58 探花日期:2015-07-28 09:12:58 榜眼日期:2015-08-18 09:48:03 状元日期:2015-08-18 09:48:03
10#
  发表于 2013-12-2 17:50:54  | 只看该作者
hh7yx 发表于 2013-12-2 16:34 
这个东西还是看你每个dml块  逻辑 有没有关联了?

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

这个commit。我觉得最好能没有就没有。慢的话,就想办法变快,否则很蛋疼。
对现状不满,只能不断加强自己!随时准备上场!
 
 楼主:  yi888long
收藏  打印  上一主题  下一主题

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

   

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6
论坛徽章:
3
2013年新春福章日期:2013-02-25 14:51:24 喜羊羊日期:2015-03-04 14:54:42 2015年新春福章日期:2015-03-06 11:59:47
11#
  发表于 2013-12-2 18:07:44  | 只看该作者
dingjun123 发表于 2013-12-2 16:19 
从事务上来说,如果是单独的存储过程调用,一个commit,如果是前台语言调用存储过程,调用的语言commit..
从 ...

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

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6
论坛徽章:
3
2013年新春福章日期:2013-02-25 14:51:24 喜羊羊日期:2015-03-04 14:54:42 2015年新春福章日期:2015-03-06 11:59:47
12#
  发表于 2013-12-2 18:08:14  | 只看该作者
hh7yx 发表于 2013-12-2 16:34 
这个东西还是看你每个dml块  逻辑 有没有关联了?

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

是啊,数据量大了,的确很麻烦
 
 
   

精华贴数
0
专家积分
1
技术积分
126
社区积分
0
注册时间
2012-12-6
论坛徽章:
3
2013年新春福章日期:2013-02-25 14:51:24 喜羊羊日期:2015-03-04 14:54:42 2015年新春福章日期:2015-03-06 11:59:47
13#
  发表于 2013-12-2 18:09:05  | 只看该作者
Naldonado 发表于 2013-12-2 17:49 
有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。

谢谢回答,不过还是应该看情况吧
 
 
   

精华贴数
0
专家积分
8
技术积分
1110
社区积分
6
注册时间
2013-4-6
论坛徽章:
4
2014年新春福章日期:2014-02-18 16:49:31 马上有钱日期:2014-02-18 16:49:31 优秀写手日期:2014-02-21 06:00:13 马上有车日期:2014-10-09 10:14:53
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
2011新春纪念徽章日期:2011-02-18 11:43:34 ITPUB十周年纪念徽章日期:2011-11-01 16:26:29 2012新春纪念徽章日期:2012-01-04 11:57:56 ITPUB 11周年纪念徽章日期:2012-10-09 18:16:00 2013年新春福章日期:2013-02-25 14:51:24 优秀写手日期:2014-03-27 06:00:13 2015年新春福章日期:2015-03-04 14:53:16 2015年新春福章日期:2015-03-06 11:58:39 喜羊羊日期:2015-03-10 14:01:43
15#
  发表于 2013-12-2 22:13:35  | 只看该作者
一般是在最后放一个吧,特别主要注意数据的一致性的问题


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

不能随便加Commit
 
 
   

版主

资深新手

精华贴数
27
专家积分
1880
技术积分
51369
社区积分
275
注册时间
2004-6-26
论坛徽章:
334
青年奥林匹克运动会-兵乓球日期:2015-05-07 14:25:27 双黄蛋日期:2015-04-21 10:16:15 蜘蛛蛋日期:2015-04-21 10:16:15 蓝锆石日期:2015-04-21 10:16:15 萤石日期:2015-04-21 10:16:15 祖母绿日期:2015-04-21 10:16:15 海蓝宝石日期:2015-04-21 10:16:15 紫水晶日期:2015-04-21 10:16:15 红宝石日期:2015-04-21 10:16:15 玉兔日期:2015-04-21 10:16:15 嫦娥日期:2015-04-21 10:16:15 玉石琵琶日期:2015-04-21 10:16:15
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
 
   

精华贴数
0
专家积分
18
技术积分
694
社区积分
0
注册时间
2012-9-25
论坛徽章:
7
蜘蛛蛋日期:2013-03-25 11:18:12 Jeep日期:2013-10-10 08:52:02 奔驰日期:2014-01-21 21:27:52 2014年新春福章日期:2014-02-18 16:49:31 马上有钱日期:2014-02-18 16:49:31 美羊羊日期:2015-03-04 14:54:27 2015年新春福章日期:2015-03-06 11:59:47
17#
  发表于 2013-12-3 11:51:31  | 只看该作者
发生了错误你就不知道在哪个状态了,还是每个都写比较好。像MySQL那种可以自动提交的,出了问题就不知道在哪里了。
http://www.cnblogs.com/wingsless/
QQ:893286870
 
   

版主

路边野花不要,踩!

招聘 :  系统分析师
精华贴数
25
专家积分
1890
技术积分
73721
社区积分
32905
注册时间
2002-11-27
论坛徽章:
467
宝马日期:2013-12-30 11:36:39 马上有房日期:2014-02-19 11:55:14 马上有钱日期:2014-02-19 11:55:14 马上有对象日期:2014-02-19 11:55:14 马上加薪日期:2014-02-19 11:55:14 2014年新春福章日期:2014-03-07 12:43:10 马上有车日期:2014-03-27 15:59:39 马上有车日期:2014-04-08 17:57:38 技术图书徽章日期:2014-04-21 10:26:40 马上有车日期:2014-02-19 11:55:14 ITPUB年度最佳版主日期:2014-02-19 10:05:27 2014年世界杯参赛球队: 加纳日期:2014-07-02 17:10:59
18#
  发表于 2013-12-3 14:19:21  | 只看该作者
7# 兔子说得很全了,建议楼主仔细体会
剑破冰山——Oracle开发艺术,数据库开发的良师益友!订购地址: china-pub |  华储
【开发人员福利】招聘SQL审核优化高工(云和恩墨)

春困秋乏夏盹冬眠年年如此 CopyRight By  lastwinner@ I TPUB . N E T 2002-2015
数据挖掘
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值