概述
在PL/SQL中,事务控制语句用于管理事务的开始、结束以及回滚。事务是一组要么全部执行,要么全部不执行的SQL语句。事务控制确保了数据库的一致性和完整性。
数据库中命令执行均与事务相关,通过COMMIT或ROLLBACK子句可提交或回滚事务。另可通过连接设置或发送命令SET AUTO_COMMIT ON/OFF
设置当前连接的事务自动提交模式。
语法格式
开始一个新的事务:
sql
BEGIN [ WORK | TRAN | TRANSACTION ]
提交当前事务,使所有更改永久化:
sql
COMMIT [ WORK | TRAN | TRANSACTION ] [AND [NO] CHAIN]
在当前事务中设置一个保存点。之后的部分事务可以被独立地回滚,而不影响整个事务。
sql
SAVEPOINT ColId
回滚当前事务,撤销所有已进行的更改:
sql
ABORT [ WORK | TRAN | TRANSACTION ]
或
sql
ROLLBACK [ WORK | TRAN | TRANSACTION ] [AND [NO] CHAIN]
将当前事务回滚到指定的保存点。ColId应该是一个之前通过SAVEPOINT命令创建的保存点名称。
sql
ROLLBACK TO [ SAVEPOINT ] ColId
注意:
非自动提交模式下,用户需显式指定提交或回滚以保证数据落盘或丢弃;DDL 语句会自动提交事务,不能被回滚,如果语句结构中存在 DDL 语句,则当 DDL 命令执行后将默认将前序命令全部提交,即使发送 ROLLBACK 也不会回滚。
参数说明
WORK | TRAN | TRANSACTION
:可选关键词,这三个词在使用时是等价的,都是为了增强语句的可读性,不影响事务运行。AND CHAIN
:当事务被提交或回滚后,立即开始一个新的事务。AND NO CHAIN
:当事务被提交或回滚后,不自动开始新的事务。ColId
: 保存点的名称,用于在事务中标记出可以回退到的点。
示例
sql
-- 建表
CREATE TABLE t_orders (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
amount DECIMAL(10, 2) NOT NULL
);
--插入数据
INSERT INTO t_orders (id, name, amount) VALUES (1, 'Alice', 1200);
INSERT INTO t_orders (id, name, amount) VALUES (2, 'Bob', 800);
-- 开始第一个事务
BEGIN;
-- 更新Alice的订单金额
UPDATE t_orders SET amount = 1500 WHERE name = 'Alice';
-- 设置保存点
SAVEPOINT update_alice;
-- 尝试更新Bob的订单金额(这里出现了一个错误,Bob金额为1000)
UPDATE t_orders SET amount = 900 WHERE name = 'Bob';
-- 假设在这里检测到了一个错误
-- 回滚到保存点
ROLLBACK TO SAVEPOINT update_alice;
-- 重新插入Bob金额
UPDATE t_orders SET amount = 1000 WHERE name = 'Bob';
-- 提交第一个事务并启动新的事务
COMMIT AND CHAIN;
-- 新的事务已经开始
-- 插入一条新的订单记录
INSERT INTO t_orders (id, name, amount) VALUES ('Charlie', 300);
-- 提交第二个事务
COMMIT;
SELECT*FROM t_orders;
ID | NAME | AMOUNT |
------------------------------------------------------------------------------
1 | Alice| 1500|
2 | Bob| 1000|
3 | Charlie| 300|