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

 找回密码
 注册
查看: 545|回复: 3

[SQL] Oracle的Autocommit设置

[复制链接]
论坛徽章:
4
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:31
发表于 2017-11-8 11:03 | 显示全部楼层 |阅读模式
本帖最后由 jxc_hn 于 2017-11-8 11:28 编辑

问题1:Oracle的autocommit是客户端控制的。发出每个DML相当于一次发出了以下PL/SQL 块:

begin
    DML;
    commit;
exception
    rollback;
end;

我理解对吗?

问题2:开发人员反映,在开发java jdbc程序时,如果Connection设置了autocommit,如果jdbc里statement用execQuery,则select for update不会自动释放.  为啥?

后来尝试用两种方法解决的: 1. 手动再commit一次。  2. 用execUpdate 而不是execQuery.    方法2是啥原因?

认证徽章
论坛徽章:
4
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-20 16:06:45技术图书徽章
日期:2017-11-17 09:13:02妮可·罗宾
日期:2017-11-17 10:43:23
发表于 2017-11-8 14:20 | 显示全部楼层
execQuery设置了autocommit 感觉和SQLPLUS中 set autocommit on 类似,对select for update 不直接影响,还是要显示commit 才能结束事务:
SQL> set autocommit on;
SQL> update mes1.emp set id=1;
2 rows updated.
Commit complete.

SQL> select * from mes1.qz_users for update;
NAME       HAS_FACEBOOK HAS_TWITTER HAS_LINKEDIN   HAS_XING
---------- ------------ ----------- ------------ ----------
Johanna               1           1            1          1
Jennifer                          1
Julianne              1           1            1
Janice                                         1          1
Jillian

SQL> select * from dba_dml_locks;
SESSION_ID OWNER                          NAME                       
---------- ------------------------------ ------------------------------
MODE_HELD     MODE_REQUESTE LAST_CONVERT
------------- ------------- ------------
BLOCKING_OTHERS
----------------------------------------
      1167 MES1                           QZ_USERS
Row-X (SX)    None                    27
Not Blocking

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-11-9 10:36 | 显示全部楼层
1. 可以这么理解,但实际上并非PL/SQL块,而是分开的两个语句。
2. 这说明这两种语句的处理方法不同,就因为COMMIT实际上是有客户端单独发出的,它在内部实现上就可以选择到底什么情况下要COMMIT,比如SELECT语句就不提交。SELECT FOR UPDATE是为了加锁,如果立即提交那就毫无意义了。

使用道具 举报

回复
论坛徽章:
26
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-18 09:31:302016猴年福章
日期:2016-02-23 09:58:342015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2017-11-9 10:51 | 显示全部楼层
这个主要还是的研究JAVA的jdbc的机制,关于AutoCommit 文档中是这么写的For Select statements, the statement is complete when the associated result set is closed. 我感觉应该是程序写的有问题

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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