📜  PL / SQL-事务

📅  最后修改于: 2020-11-26 06:02:34             🧑  作者: Mango


在本章中,我们将讨论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;

例如,

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为止。

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

自动交易控制

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

SET AUTOCOMMIT ON; 

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

SET AUTOCOMMIT OFF;