六、事务(commit、rollback、set transaction)
事务在数据库中是工作的逻辑单元,单个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制,可以确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。
1、事务特性(ACID)
**原子性(Atomicity):**一个事务里面所有包含的SQL语句都是一个整体,是不可分割的,要么不做,要么都做。
**一致性(Consistency):**事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的。
**隔离性(Isolation):**数据库允许多个并发事务同时对其中的数据进行读写和修改的能力,隔离性可以防止事务在并发执行时,由于他们的操作命令交叉执行而导致的数据不一致状态。
持久性 (Durability) : 当事务结束后,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失。
2、commit(提交)
#可查看这一博客,使用方法等
https://blog.csdn.net/qq_42816766/article/details/92802409
commit分为显性提交和隐形提交和自动提交。
-
显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;
-
隐式提交:用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
-
自动提交:若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交。
自动提交设置方式:SQL>SET AUTOCOMMIT ON;
注意:无论autocommit为何值,当退出sql*plus时,当前会话所有的DML操作所改变的数据都会被提交
例子:
- 模拟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
-
模拟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
-
自动提交
-
模拟设置自动提交
#第一个终端 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
-
模拟set auto 3(三条语句执行之后自动提交)
注意:n 表示成功执行n 条DML 操作后再自动提交,n不能小于0。这里的n是指DML语句的个数,而不是DML语句所影响的行数。
#第一个终端 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、rollback(回滚)
#可查看这一博客,使用方法等
https://blog.csdn.net/qq_34745941/article/details/86635712
rollback可选子句解释:
#例句
-- *****************************************************************
-- 直接 回滚 事务
-- *****************************************************************
declare
begin
insert into student_info (sno, name, sex) values (1, '张三', '女');
insert into student_info (sno, name, sex) values (2, '李四', '男');
rollback;
end;
#declare。。。begin。。。end;像一个方法;
#declare --声明
#begin --开始
#end; --结束
-- *****************************************************************
-- 1. savepoint xx: 回滚到回滚点 xx
-- 2. 若回滚点同名,则回滚至最近的一个回滚点(不建议同名,不方便排查问题)
-- *****************************************************************
declare
begin
insert into student_info (sno, name, sex) values (1, '张三', '女');
savepoint sp1;
insert into student_info (sno, name, sex) values (2, '李四', '女');
savepoint sp2; -- 若也是 ps1,则回滚至此处(最近)
-- 模拟报错:违反唯一性约束
insert into student_info (sno, name, sex) values (2, '王五', '男');
savepoint sp3;
commit;
exception
when others then
rollback to sp1;
-- 报错信息
dbms_output.put_line(dbms_utility.format_error_backtrace);
dbms_output.put_line(sqlcode ||' : ' || sqlerrm);
commit;
end;
-- *****************************************************************
-- 1. rollback work force ‘string’
-- 2. force中的’25.32.87‘ 主要为事务id
-- *****************************************************************
(1) select * from dba_2pc_pending; -- 查询
(2) rollback work force '25.32.87'; -- 回滚