查看: 25250|回复: 17

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

[复制链接]
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:24喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47
跳转到指定楼层
1#
发表于 2013-12-2 15:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 yi888long 于 2013-12-2 15:38 编辑

比如说,我有很多update和delete语句,我需要在每一个后面都commit,还是只需要在最后一行写一个commit就行了?这两者有什么区别吗?我自己试了下,好像都一样,但是不知道会不会在什么情况下有区别? 请教大家,谢谢了。。
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
18#
发表于 2013-12-3 14:19 | 只看该作者
7# 兔子说得很全了,建议楼主仔细体会

使用道具 举报

回复
论坛徽章:
7
蜘蛛蛋
日期:2013-03-25 11:18:12Jeep
日期:2013-10-10 08:52:02奔驰
日期:2014-01-21 21:27:522014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31美羊羊
日期:2015-03-04 14:54:272015年新春福章
日期:2015-03-06 11:59:47
17#
发表于 2013-12-3 11:51 | 只看该作者
发生了错误你就不知道在哪个状态了,还是每个都写比较好。像MySQL那种可以自动提交的,出了问题就不知道在哪里了。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
16#
发表于 2013-12-3 00:41 | 只看该作者
首先,要保证事务完整性,这个是大前提。如果是同一个事务绝不可在中间COMMIT。
如果是大型DML操作,且不属于同一个事务,中间提交是没有问题,但要确保你的程序在万一失败的情况下,再次运行时能否识别出已处理和未处理的数据。

使用道具 举报

回复
求职 : ERP实施
论坛徽章:
9
2011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-03-27 06:00:132015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39喜羊羊
日期:2015-03-10 14:01:43
15#
发表于 2013-12-2 22:13 | 只看该作者
一般是在最后放一个吧,特别主要注意数据的一致性的问题


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

不能随便加Commit

使用道具 举报

回复
论坛徽章:
6
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技术图书徽章
日期:2017-07-12 17:18:46妮可·罗宾
日期:2017-08-10 12:13:56
14#
发表于 2013-12-2 21:39 | 只看该作者
某种情况如:一个sp中多个dml语句,1.insert into t select ...;  commit 2. delete from t where ..;如果语句2失败,则不能保证事务的完整性,表数据t可能会有脏数据

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:24喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47
13#
 楼主| 发表于 2013-12-2 18:09 | 只看该作者
Naldonado 发表于 2013-12-2 17:49
有commit,就有风险,你要知道,一旦commi,就很难回去了。建议最好没有。

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

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:24喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47
12#
 楼主| 发表于 2013-12-2 18:08 | 只看该作者
hh7yx 发表于 2013-12-2 16:34
这个东西还是看你每个dml块  逻辑 有没有关联了?

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

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

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:24喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47
11#
 楼主| 发表于 2013-12-2 18:07 | 只看该作者
dingjun123 发表于 2013-12-2 16:19
从事务上来说,如果是单独的存储过程调用,一个commit,如果是前台语言调用存储过程,调用的语言commit..
从 ...

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

使用道具 举报

回复
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期: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
10#
发表于 2013-12-2 17:50 | 只看该作者
hh7yx 发表于 2013-12-2 16:34
这个东西还是看你每个dml块  逻辑 有没有关联了?

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

这个commit。我觉得最好能没有就没有。慢的话,就想办法变快,否则很蛋疼。

使用道具 举报

回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表