Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


TCL(事务控制语言)

📄字数 1.7K
👁️阅读量 加载中...

事务控制语言(Transaction Control Language,简称 TCL)是 SQL 的一个重要子集,专门用于管理数据库事务 —— 即由多个操作组成的、需作为原子单元执行的逻辑工作单元。
借助 TCL 命令,能够严格保证一组数据库操作的执行结果具有 “全部成功或全部失败” 的特性:要么所有操作全部提交并永久生效,要么在发生错误时全部回滚至初始状态,以此确保事务满足 ACID 特性(原子性、一致性、隔离性、持久性),是维护数据库数据完整性和一致性的核心工具。

一、启动事务

开始事务标志着一个事务的开始,在此之后执行的所有SQL语句都将成为该事务的一部分,直到事务被提交或回滚。

1.1 语法格式

1.2 参数说明

  • BEGINSTART:表示一个事务的开始。
  • opt_trans:可选关键字,用来更清晰地表达“启动事务”。以下四条命令等效:
    • BEGIN
    • BEGIN WORK
    • BEGIN TRAN
    • BEGIN TRANSACTION

二、提交事务

提交事务用于将当前事务的所有修改永久保存到数据库,并释放事务持有的所有锁与结束当前事务。

2.1 语法格式

2.2 参数说明

  • COMMIT:提交事务。
  • opt_trans:可选关键字,用来强调“提交事务”。以下四条命令等效:
    • COMMIT
    • COMMIT WORK
    • COMMIT TRAN
    • COMMIT TRANSACTION

三、回滚事务

回滚事务用于撤销当前事务的所有修改,并回滚到事务开始前的状态与释放事务持有的锁。

3.1 语法格式

3.2 参数说明

  • ROLLBACKABORT:功能完全等效,均会终止当前事务并回滚所有未提交的修改。
  • TO SAVEPOINT <名称>:回滚到指定保存点。
  • opt_trans:可选关键字,用来强调“回滚事务”。以下四条命令等效:
    • ROLLBACK
    • ROLLBACK WORK
    • ROLLBACK TRAN
    • ROLLBACK TRANSACTION

四、保存点

保存点用于在事务内部创建回滚标记点,且允许部分回滚而非整个事务。

4.1 语法格式

设置保存点

删除保存点

4.2 参数说明

  • SAVEPOINT <名称>:在当前事务中创建一个保存点。
  • RELEASE SAVEPOINT <名称>:删除指定的保存点。

提示

保存点作用范围只限于当前连接,如果想要回退到某一个保存点,需在提交事务之前。

五、示例

sql
-- 创建测试表
SQL> CREATE TABLE tb_test(id INT PRIMARY KEY, val VARCHAR);

-- 开启事务
SQL> BEGIN TRANSACTION;

-- 填充测试数据
SQL> INSERT INTO tb_test VALUES(1, 'aaa');
SQL> INSERT INTO tb_test VALUES(2, 'bbb');

-- 提交事务
SQL> COMMIT;

-- 验证测试表数据
SQL> SELECT * from tb_test;

+----+-----+
| ID | VAL |
+----+-----+
| 1  | aaa |
| 2  | bbb |
+----+-----+

-- 开启事务
SQL> START TRANSACTION;

-- 填充测试数据
SQL> INSERT INTO tb_test VALUES(3, 'ccc');
SQL> INSERT INTO tb_test VALUES(4, 'ddd');

-- 回滚事务
SQL> ROLLBACK;

-- 验证测试表数据
SQL> SELECT * from tb_test;

+----+-----+
| ID | VAL |
+----+-----+
| 1  | aaa |
| 2  | bbb |
+----+-----+

-- 开启事务
SQL> BEGIN;

-- 填充测试数据
SQL> INSERT INTO tb_test VALUES(3, 'ccc');
SQL> INSERT INTO tb_test VALUES(4, 'ddd');

-- 设置保存点S1
SQL> SAVEPOINT S1;

-- 填充测试数据
SQL> INSERT INTO tb_test VALUES(5, 'eee');
SQL> INSERT INTO tb_test VALUES(6, 'fff');

-- 回退到保存点S1
SQL> ROLLBACK TO S1;

-- 提交事务
SQL> COMMIT;

-- 验证测试表数据
SQL> SELECT * from tb_test;

+----+-----+
| ID | VAL |
+----+-----+
| 1  | aaa |
| 2  | bbb |
| 3  | ccc |
| 4  | ddd |
+----+-----+