Plsql 简明教程

PL/SQL - Transactions

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

成功执行的 SQL 语句和提交的事务不同。即使 SQL 语句成功执行,但除非提交包含该语句的事务,否则可以回滚该语句并撤销该语句所做的所有更改。

Starting and Ending a Transaction

事务有 beginningend 。当发生以下事件之一时,事务开始:

  1. 连接到数据库后执行第一条 SQL 语句。

  2. 事务完成后发出的每条新 SQL 语句。

当发生以下事件之一时,事务结束:

  1. 发出 COMMITROLLBACK 语句。

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

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

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

  5. 用户通过发出 EXIT 命令退出 SQL*PLUS ,会自动执行一条 COMMIT 语句。

  6. SQL*Plus 异常终止,会自动执行 ROLLBACK 语句。

  7. DML 语句失败,在这种情况下会自动执行一条 ROLLBACK 语句以撤销该 DML 语句。

Committing a Transaction

通过发出 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;

Rolling Back Transactions

在不执行 COMMIT 的情况下对数据库所做的更改可以使用 ROLLBACK 命令撤销。

ROLLBACK 命令的常规语法为:

ROLLBACK [TO SAVEPOINT < savepoint_name>];

当事务由于系统故障等前所未有的情况而中止时,从上次提交后整个事务都会自动回滚。如果不使用 savepoint ,则只需使用以下语句回滚所有更改:

ROLLBACK;

Savepoints

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

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

Automatic Transaction Control

要设置只要执行 COMMITINSERT, UPDATE 命令时,自动执行 DELETE ,您可以设置 AUTOCOMMIT 环境变量,如下所示:

SET AUTOCOMMIT ON;

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

SET AUTOCOMMIT OFF;