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