- PL/SQL 教程
- PL/SQL - 首页
- PL/SQL - 概述
- PL/SQL - 环境
- PL/SQL - 基本语法
- PL/SQL - 数据类型
- PL/SQL - 变量
- PL/SQL - 常量和字面量
- PL/SQL - 运算符
- PL/SQL - 条件
- PL/SQL - 循环
- PL/SQL - 字符串
- PL/SQL - 数组
- PL/SQL - 过程
- PL/SQL - 函数
- PL/SQL - 游标
- PL/SQL - 记录
- PL/SQL - 异常
- PL/SQL - 触发器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事务
- PL/SQL - 日期和时间
- PL/SQL - DBMS 输出
- PL/SQL - 面向对象
- PL/SQL 有用资源
- PL/SQL - 问题和解答
- PL/SQL - 快速指南
- PL/SQL - 有用资源
- PL/SQL - 讨论
PL/SQL - 事务
在本章中,我们将讨论 PL/SQL 中的事务。数据库事务是可能由一个或多个相关 SQL 语句组成的工作的原子单元。它被称为原子,因为构成事务的 SQL 语句带来的数据库修改可以集体地被提交,即永久保存到数据库中,或者从数据库中回滚(撤消)。
成功执行的 SQL 语句和已提交的事务并不相同。即使 SQL 语句成功执行,除非包含该语句的事务已提交,否则它可以回滚,并且该语句所做的所有更改都可以撤消。
启动和结束事务
事务有开始和结束。当以下事件之一发生时,事务开始:
连接到数据库后执行第一个 SQL 语句。
在事务完成后发出的每个新的 SQL 语句。
当以下事件之一发生时,事务结束:
发出COMMIT或ROLLBACK语句。
发出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;
回滚事务
对数据库所做的未经 COMMIT 的更改可以使用 ROLLBACK 命令撤消。
ROLLBACK 命令的通用语法如下:
ROLLBACK [TO SAVEPOINT < savepoint_name>];
当事务由于某些意外情况(例如系统故障)而中止时,自上次提交以来整个事务会自动回滚。如果您未使用保存点,则只需使用以下语句即可回滚所有更改:
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、UPDATE或DELETE命令时自动执行COMMIT,您可以设置AUTOCOMMIT环境变量,如下所示:
SET AUTOCOMMIT ON;
您可以使用以下命令关闭自动提交模式:
SET AUTOCOMMIT OFF;