六、事务(commit、rollback)

六、事务(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

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTFd3hfG-1676894166957)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220185222600.png)]

rollback可选子句解释:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtSKnq55-1676894166958)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220185441905.png)]

#例句
-- *****************************************************************
-- 直接 回滚 事务
-- *****************************************************************
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';  -- 回滚
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值