oracle中commit的用法

1、commit(提交)的作用

在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在Oracle 数据库中,
在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成时才能看见。

2、commit的类型

2.1 显式提交

用COMMIT 命令直接完成的提交为显式提交

格式

SQL>COMMIT;

2.2 隐式提交

用SQL 命令间接完成的提交为隐式提交

命令有以下的

ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME

2.3 自动提交

若把AUTOCOMMIT 设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。

格式

SQL>SET AUTOCOMMIT ON;

关于自动提交命令的选项

SYS@PROD1> set auto
SP2-0281: autocommit missing set option
Usage: SET AUTO[COMMIT] { COMMIT] { OFF | ON | IMM[EDIATE] | n }  ##n 表示成功执行n 条
DML 操作后再自动提交,n 不能小于0
SYS@PROD1> show auto      ##查看是否自动提交
autocommit OFF            ##OFF表示关闭
SCOTT@PROD1> set autocommit on   ##设置自动提交
SCOTT@PROD1> show autocommit
autocommit IMMEDIATE             ##ON和IMM都表示自动提交

3、练习

3.1 模拟commit DML语句事物提交前后区别(显式提交)

第一个终端操作

[oracle@localhost ~]$ sqlplus / as sysdba
SYS@OCPLHR1> create table test1 as select * from dual;
Table created.

SYS@OCPLHR1> insert into test1 values('b');
1 row created.

SYS@OCPLHR1> select * from test1;
D
-
X
b

SYS@OCPLHR1> commit;      ##commit之前记得在终端2上查看test1表
Commit complete.

第二个终端操作

[oracle@localhost ~]$ sqlplus / as sysdba
SYS@OCPLHR1> select * from test1;     ##commit之前
D
-
X

SYS@OCPLHR1> select * from test1;     ##commit之后
D
-
X
b

3.2 模拟DDL语句执行之后隐式事物自动提交(隐式提交)

第一个终端操作

SYS@OCPLHR1> insert into test1 values('c');    ##执行这条语句之后终端2上查看test1表,没有变化
1 row created.

SYS@OCPLHR1> create table test2 as select * from dual;    ##执行这条语句之后再去2上查看test1表,数据以及提交
Table created.

第二个终端操作

SYS@OCPLHR1> select * from test1;      ##第一条语句执行完后的查看结果
D
-
X
b

SYS@OCPLHR1> select * from test1;		##第二条语句执行完成后的查看结果
D
-
X
b
c

3.3 自动提交

3.3.1 模拟设置自动提交

第一个终端

SYS@OCPLHR1> show auto;
autocommit OFF

SYS@OCPLHR1> set autocommit on;

SYS@OCPLHR1> show autocommit
autocommit IMMEDIATE

SYS@OCPLHR1> insert into test1 values(1);
1 row created.
Commit complete.

SYS@OCPLHR1> select * from test1;
D
-
X
b
c
1

第二个终端

SYS@OCPLHR1> select * from test1;
D
-
X
b
c
1

3.3.2 模拟set auto 3(三条语句执行之后自动提交)

第一个终端

SYS@OCPLHR1> delete test2;
1 rows deleted.

SYS@OCPLHR1> set auto 3;

SYS@OCPLHR1> select * from test2;
no rows selected


SYS@OCPLHR1> insert into test2 values(1);
1 row created.

SYS@OCPLHR1> insert into test2 values(2);
1 row created.

SYS@OCPLHR1> insert into test2 values(3);
1 row created.
Commit complete.

第二个终端

SYS@OCPLHR1> select * from test2;		##第一次插入数据查看
no rows selected

SYS@OCPLHR1> select * from test2;		##第二次插入数据查看 
no rows selected

SYS@OCPLHR1> select * from test2;		##第三次插入数据查看
D
-
X
1
2
3

3.3.3 模拟set auto n 中 n 的影响

注意:n 表示成功执行n 条DML 操作后再自动提交,n不能小于0。这里的n是指DML语句的个数,而不是DML语句所影响的行数。

第一个终端

SYS@OCPLHR1> insert into test2 select * from test2;
3 rows created.

第二个终端

SYS@OCPLHR1> select * from test2;       ##数据没有改变
D
-
1
2
3

第一个终端

SYS@OCPLHR1> insert into test2 select * from test2;
6 rows created.        # 3+3

第二个终端

SYS@OCPLHR1> select * from test2;		##数据没有改变
D
-
1
2
3

第一个终端

SYS@OCPLHR1> insert into test2 select * from test2;
12 rows created		## 6+6
Commit complete.

第二个终端

SYS@OCPLHR1> select * from test2;

D
-
1
2
3
......
24 rows selected.

3.4 模拟退出sql*plus所提交的数据

注意:无论autocommit为何值,当退出sql*plus时,当前会话所有的DML操作所改变的数据都会被提交 

第一个终端

SYS@OCPLHR1> delete from test1
5 rows deleted.

SYS@OCPLHR1> delete test2;
24 rows deleted.

SYS@OCPLHR1> commit;
Commit complete.

SYS@OCPLHR1> insert into test1 values(1);
1 row created.

第二个终端

SYS@OCPLHR1> select * from test1;
no rows selected

第一个终端

SYS@OCPLHR1> insert into test1 values(2);
1 row created.
SYS@OCPLHR1> exit

第二个终端

SYS@OCPLHR1> select * from test1;
D
-
1
2

  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库,可以通过查看数据库的redo日志来获取commit命令的执行时间。Redo日志是数据库事务的基础,它记录了所有修改数据库的操作,包括commit命令。 以下是查看commit命令执行时间的步骤: 1. 首先,使用v$session视图或者v$transaction视图,找到commit操作所在的会话或事务的ID。 例如,使用以下语句查找最近一次commit操作所在的会话ID: ``` SELECT SID, SERIAL#, LOGON_TIME FROM V$SESSION WHERE USERNAME = 'your_username' AND ROWNUM = 1 ORDER BY LOGON_TIME DESC; ``` 2. 使用v$log_history视图或v$archived_log视图来查找commit操作所在的日志文件。 例如,使用以下语句查找包含最近一次commit操作的日志文件: ``` SELECT FIRST_TIME, NEXT_TIME, NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME <= (SELECT MAX(TIME) FROM V$TRANSACTION) AND NEXT_TIME >= (SELECT MAX(TIME) FROM V$TRANSACTION); ``` 3. 找到对应的日志文件,使用LogMiner等工具来解析日志文件的信息,包括commit命令的执行时间。 例如,使用以下语句在当前数据库解析commit命令所在的日志文件: ``` BEGIN DBMS_LOGMNR.START_LOGMNR( STARTTIME => TO_DATE('2021-11-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), ENDTIME => TO_DATE('2021-11-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE ); END; ``` 以上是在当前数据库解析日志文件的方法,也可以使用LogMiner工具在外部解析日志文件。解析完成后,可以通过查询V$LOGMNR_CONTENTS视图获取commit命令的执行时间等信息。 注意,LogMiner的使用需要具备一定的权限和技术能力,建议在测试环境进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值