oracle会话关闭自动提交,oracle数据库自动提交事务(autocommit)

本文讨论了Oracle数据库中关于事务控制的问题,特别是自动提交和隐式提交的概念。当使用`connect`命令切换用户时,事务会被提交。显式提交是通过`COMMIT`命令完成,隐式提交则涉及特定的SQL命令,如DDL。自动提交在设置`AUTOCOMMIT`为ON时,每次DML操作后都会提交。在SQLPlus中,可以通过`set autocommit on`设置,但频繁提交可能影响性能。此外,文章还提到了保存点和事务锁的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9d2df6a2ad1bb5d37b2fe633f0d20275.png

问题描述:如上图所示,以scott账号登陆,执行delete from dept where deptno=50后,再换system账号登陆,发现deptno=50的数据行已经被删除了,而show autocommit=OFF;

原因:切换用户,用的是connect命令,是会提交事务的。

解决方法:再打开一个控制台sqlplus用另一用户登录啊。在一个sqlplus不可能用多个session的。如图

bf43afd15e5feef17eedec9f8b8396b3.png

附加知识:

提交数据有三种类型:

显式提交、隐式提交及自动提交。下面分别说明这三种类型。

1、显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;

2、隐式提交:用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

3、自动提交:若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:SQL>SET AUTOCOMMIT ON;

----------------

在sqlplus里的话,可以设置环境变量 set autocommit on 不过太频繁的提交也不好的。提交一次LGWR就要写一下LOG。

--------------------------------------------

追问

那么ora11g中那个控制台的运行环境怎么配置、使用?

回答

不用配置啊。默认时autocommit 为off,但当你用数据定义语言DDL (即第二种隐式提交命令时),即使autocommit 为off也是会提交事务的。如果你想回到提交事务之前的某个点,可设savapoint,然会用rollback to savepoint。

在你的问题补充我看出问题来,你切换用户,应该用的是connect命令,是会提交事务的。其实你完全可以再打开一个控制台sqlplus用另一用户登录啊。在一个sqlplus不可能用多个session的

附加:

事务要对对象进行某类操作,则先要申请获取该对象对应的锁(什么锁类型 对应允许事务对对象进行什么类操作) 各类操作对应锁类型叠加组合   事务结束释放自己在对象上锁 类型叠加组合   其他

事务在该对象上锁 类型叠加组合还在          事务A获取该对象对应的锁时,即该对象被(事务A)锁定,其他事务就不能修改该对象

DDL语句,即在当前还处于活动(或说是执行)的事务上自动创建开启一个隐式事务并执行(手动)提交(语句)

DML语句,即ocistmtexecute函数中的参数mode为oci_commit_on_success时则在当前还处于活动(或说是执行)的事务上自动创建开启一个隐式事务并执行(手动)提交(语句),ocistmtexecute函数

中的参数mode不为oci_commit_on_success时则在当前还处于活动(或说是执行)的事务上执行该DML语句并等待用户输入执行(手动)提交(语句)。

注释:

判断ocistmtexecute函数中的参数mode为oci_commit_on_success时则在当前还处于活动(或说是执行)的事务上是佛自动创建开启一个隐式事务?

先ocitransbegin()显示创建开启一个事务

后执行DML语句,ocistmtexecute函数中的参数mode为oci_commit_on_success

再后执行DML语句,ocistmtexecute函数中的参数mode不为oci_commit_on_success,看该语句是否出错.

错了,说明前一个DML提交了该显示事务,自己并没有创基一个隐式事务。

DDL语句,即ocistmtexecute函数中的参数mode写死不为oci_commit_on_success

DML语句,即ocistmtexecute函数中的参数mode没有写死

命令set autocommit on实际是修改ocistmtexecute函数中的参数mode的值,所以当你用数据定义语言DDL (即第二种隐式提交命令时),即使autocommit 为off也是会提交事务的。

一个会话下的一个事务内的select语句可以查看本事务对数据的该表,一个会话下可以有多个事务

参考:

http://wenku.baidu.com/link?url=aLEOPfmUStSvYaAvpyb65zQZlgQEhavhzVX27N_58V4rnAPq82YFtqT_7PBU-_1lg1gteC5xBXfRXF34L5t8x4bfeydTFrnOEVrhswpbgyi&pn=51

第8章 oracle数据操作与事务控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值