TCL(会话控制)

TCL

TCL (Transaction Control Language) 是用于控制事务的语言,包括提交 (commit)、回滚 (rollback) 和保存点 (savepoint)。

概述

COMMIT:            将所有的事务更改永久保存到数据库中,结束当前事务。
ROLLBACK: 撤销当前事务的所有更改,回滚到事务开始之前的状态。
SAVEPOINT: 为当前事务创建一个保存点,可以在事务执行过程中使用 ROLLBACK 回滚到指定的保存点。
RELEASE SAVEPOINT: 删除事务中指定的保存点,释放相关的数据库资源。
SET TRANSACTION: 设置事务的隔离级别和事务的读写特性。

TCL一般与DML语句配合使用。

事务:一个事务是一组SQL语句。

“事务”格式如下:

-- 开始一个事务
BEGIN TRANSACTION;
-- SQL 语句块
COMMIT;
-- 提交事务

COMMIT(提交)

-- 将当前事务做出的更改提交并保存到数据库,释放锁定的资源。 
COMMIT;

-- 特殊情况(不是所有的数据库都支持)
COMMIT WORK: 默认选项,表示提交当前事务并释放锁定资源。与基本的COMMIT语句相同。
COMMIT TRANSACTION: 与COMMIT WORK相同,也是默认选项。表示提交当前事务并释放锁定资源。

COMMIT AND CHAIN: 提交当前事务并立即启动一个新的事务,使新的事务成为当前事务。
COMMIT AND NO CHAIN: 提交当前事务并不立即启动一个新的事务。这是默认选项。
COMMIT RETAIN LOCKS: 提交当前事务,但保留当前事务所获取的所有锁定资源。

ROLLBACK(撤销与回滚)

用于撤销未提交的事务或回滚已经提交的事务。
注: COMMIT 后不能被撤销操作修改,也就是撤销不了已经提交保存到数据的修改。

-- 1.撤销未提交的事务

-- 事务开始
BEGIN TRANSACTION;
-- 做一些修改
ROLLBACK; -- 撤销所有的修改至事务开始
-- (等于你啥都没写,啥都没修改)


-- 2.回滚到指定的保存点
BEGIN TRANSACTION;
-- 做一些修改
SAVEPOINT my_savepoint;
-- 做一些其他的修改
ROLLBACK TO SAVEPOINT my_savepoint; -- 将当前事务回滚到保存点my_savepoint
-- 未COMMIT的所有操作都会被取消,并且回到最初的状态。
-- 也就是说,回滚到保存点后,在保存点后新的操作都将被撤销。

SAVEPOINT(保存点)

用于创建一个保存点。上面在撤销时可以直接撤销到保存点而不是撤销整个修改的操作。
注:当整个事务COMMIT后,所有的 SAVEPOINT 都会失效!(不能回滚的原因)

-- 语法
SAVEPOINT savepoint_name;

RELEASE SAVEPOINT(删保存节点)

如果指定的保存点名称存在,则该命令将删除保存点,并释放由保存点所占用的所有相关资源。
如果指定的保存点名称不存在就报错。

RELEASE SAVEPOINT savepoint_name;

SET TRANSACTION(隔离级别)

用于设置事务的隔离级别和其他选项。

ISOLATION LEVEL:用于设置事务的隔离级别。
READ UNCOMMITTED 读未提交
READ COMMITTED 已提交读
REPEATABLE READ 可重复读取
SERIALIZABLE 可序列化

默认的隔离级别是数据库的默认隔离级别。

==>
在 MySQL 中,默认隔离级别是 Repeatable Read(可重复读);
在 PostgreSQL 中,默认隔离级别是 Read Committed(已提交读);
在 Oracle 中,默认隔离级别是 Read Committed(已提交读)
eg:
-- 设置隔离级别为 READ COMMITTED,读写性质为 READ WRITE:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;


READ ONLY / READ WRITE:用于设置事务的读写性质。
READ ONLY 则事务只能进行读取操作;
READ WRITE 则事务可以进行读取和写入操作(默认)。
eg:
-- 设置事务为只读,不可延迟:
SET TRANSACTION READ ONLY NOT DEFERRABLE;


DEFERRABLE / NOT DEFERRABLE:用于设置事务的延迟性质。
DEFERRABLE 事务可以延迟提交,直到其他事务完成。
NOT DEFERRABLE 事务必须立即提交(默认)。
eg:
-- 设置事务为可读可写,可延迟:
SET TRANSACTION READ WRITE DEFERRABLE;