PL/SQL - 事务

在本章中,我们将讨论 PL/SQL 中的事务。 数据库事务 是一个原子工作单元,可能由一个或多个相关的 SQL 语句组成。 之所以称为原子,是因为构成事务的 SQL 语句带来的数据库修改可以共同提交,即永久保存到数据库,也可以从数据库回滚(撤消)。

一个成功执行的 SQL 语句和一个提交的事务是不一样的。 即使一条 SQL 语句执行成功,除非包含该语句的事务被提交,否则它可以回滚并且语句所做的所有更改都可以撤消。


开始和结束事务

一个事务有一个开始和一个结束。 当以下事件之一发生时,事务开始 −

  • 第一条 SQL 语句是在连接到数据库后执行的。

  • 在事务完成后发出的每个新 SQL 语句。

当以下事件之一发生时,交易结束 −

  • 发出 COMMITROLLBACK 语句。

  • 发出 DDL 语句,例如 CREATE TABLE 语句; 因为在这种情况下会自动执行 COMMIT。

  • 发出 DCL 语句,例如 GRANT 语句; 因为在这种情况下会自动执行 COMMIT。

  • 用户断开与数据库的连接。

  • 用户通过发出 EXIT 命令从 SQL*PLUS 退出,COMMIT 会自动执行。

  • SQL*Plus 异常终止,自动执行 ROLLBACK

  • DML 语句失败; 在这种情况下,会自动执行 ROLLBACK 以撤消该 DML 语句。


提交事务

通过发出 SQL 命令 COMMIT 使事务永久化。 COMMIT 命令的一般语法是 −

COMMIT;

For example,

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;

回退事务

在没有 COMMIT 的情况下对数据库所做的更改可以使用 ROLLBACK 命令撤消。

ROLLBACK 命令的一般语法是 −

ROLLBACK [TO SAVEPOINT < savepoint_name>]; 

当事务由于某种前所未有的情况而中止时,例如系统故障,自提交以来的整个事务将自动回滚。 如果您没有使用 savepoint 保存点,则只需使用以下语句回滚所有更改 −

ROLLBACK;

保存点

SAVEPOINT 保存点是一种标记,通过设置一些检查点来帮助将长事务拆分为更小的单元。 通过在长事务中设置保存点,您可以在需要时回滚到检查点。 这是通过发出 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 的位置。

之后,您所做的新更改将开始。


自动事务控制

要在执行 INSERT、UPDATEDELETE 命令时自动执行 COMMIT,可以将 AUTOCOMMIT 环境变量设置为 −

SET AUTOCOMMIT ON; 

您可以使用以下命令关闭自动提交模式 −

SET AUTOCOMMIT OFF;