PL/SQL - 事务

  • 简述

    在本章中,我们将讨论 PL/SQL 中的事务。一个数据库transaction是一个原子工作单元,可能由一个或多个相关的 SQL 语句组成。之所以称为原子性,是因为由构成事务的 SQL 语句带来的数据库修改可以共同提交,即永久保存到数据库中,也可以从数据库中回滚(撤消)。
    成功执行的 SQL 语句和提交的事务并不相同。即使一条 SQL 语句成功执行,除非包含该语句的事务被提交,否则它可以回滚并且该语句所做的所有更改都可以撤消。
  • 开始和结束事务

    一笔事务有一个 beginningend. 当发生以下事件之一时,事务开始 -
    • 连接数据库后执行第一条SQL语句。
    • 在事务完成后发出的每个新 SQL 语句处。
    当发生以下事件之一时,事务结束 -
    • COMMITROLLBACK 发表声明。
    • DDL 声明,例如 CREATE TABLE声明,发出;因为在这种情况下会自动执行 COMMIT。
    • DCL 声明,例如 GRANT声明,发出;因为在这种情况下会自动执行 COMMIT。
    • 用户与数据库断开连接。
    • 用户退出 SQL*PLUS 通过发出 EXIT 命令,会自动执行 COMMIT。
    • SQL*Plus 异常终止,一个 ROLLBACK 是自动执行的。
    • DML声明失败;在这种情况下,会自动执行 ROLLBACK 以撤消该 DML 语句。
  • 提交事务

    通过发出 SQL 命令 COMMIT 使事务永久化。COMMIT 命令的一般语法是 -
    
    COMMIT;
    
    例如,
    
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ); 
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 ); 
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (3, 'kaushik', 23, 'Kota', 2000.00 ); 
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 ); 
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (6, 'Komal', 22, 'MP', 4500.00 ); 
    COMMIT;
    
  • 回滚事务

    可以使用 ROLLBACK 命令撤消在没有 COMMIT 的情况下对数据库所做的更改。
    ROLLBACK 命令的一般语法是 -
    
    ROLLBACK [TO SAVEPOINT < savepoint_name>]; 
    
    当事务由于某种前所未有的情况而中止时,例如系统故障,自提交以来的整个事务都会自动回滚。如果您不使用savepoint,然后只需使用以下语句回滚所有更改 -
    
    ROLLBACK;
    

    保存点

    保存点是一种标记,通过设置一些检查点,有助于将长事务拆分为更小的单元。通过在长事务中设置保存点,您可以根据需要回滚到检查点。这是通过发出SAVEPOINT 命令。
    SAVEPOINT 命令的一般语法是 -
    
    SAVEPOINT < savepoint_name >;
    
    例如
    
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (7, 'Rajnish', 27, 'HP', 9500.00 ); 
    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
    VALUES (8, 'Riddhi', 21, 'WB', 4500.00 ); 
    SAVEPOINT sav1;
      
    UPDATE CUSTOMERS 
    SET SALARY = SALARY + 1000; 
    ROLLBACK TO sav1;
      
    UPDATE CUSTOMERS 
    SET SALARY = SALARY + 1000 
    WHERE ID = 7; 
    UPDATE CUSTOMERS 
    SET SALARY = SALARY + 1000 
    WHERE ID = 8; 
    COMMIT;
    
    ROLLBACK TO sav1 - 该语句将所有更改回滚到您标记保存点 sav1 的位置。
    之后,您所做的新更改将开始。
  • 自动事务控制

    执行一个 COMMIT 每当 INSERT, UPDATE 要么 DELETE 命令执行后,可以设置 AUTOCOMMIT 环境变量为 -
    
    SET AUTOCOMMIT ON; 
    
    您可以使用以下命令关闭自动提交模式 -
    
    SET AUTOCOMMIT OFF;