PL/SQL事务 - PL/SQL教程

数据库事务是一个工作的原子单元,其可以由一个或多个相关的SQL语句组成。所谓的原子性就是数据库的修改所带来的构成事务的SQL语句可以集体被提交,即永久到数据库或从数据库中(撤消)回滚。

一个成功执行的SQL语句和提交的事务不一样。即使一个SQL语句执行成功,除非包含该语句的事务被提交,但也可以回滚和声明(S)的所有更改可以撤消。

开始/结束事务

事务都有开始和结束。事务开始时有下列事件之一:

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

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

事务结束时的下列事件之一发生:

  • COMMIT或发出ROLLBACK语句。

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

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

  • 用户从数据库断开。

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

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

  • 一个DML语句失败; 在这种情况下自动执行撤消DML语句ROLLBACK。

提交事务

事务是通过发出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命令撤消。

ROLLBACK命令的一般语法是:

ROLLBACK [TO SAVEPOINT < saveyiibai_name>];

当一个事务因一些前所未有的情况中止,如系统故障,则整个事务由于提交自动回滚。如果不使用保存点,然后简单地使用下面的语句来回滚所有的变化:

ROLLBACK;

保存点

保存点是某种标志,帮助分裂一个长事务分成更小的单位设置了一些检查点。由一个长事务中设置保存点,可以根据需要回滚到一个检查点。这是通过发出SAVEPOINT命令来完成。

保存点命令的一般语法是:

SAVEPOINT < saveyiibai_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;