SQL - 事务


事务是在数据库上执行的工作单元或序列。事务以逻辑顺序完成,无论是由用户手动方式还是由某种数据库程序自动完成。

事务是对数据库的一个或多个更改的传播。例如,如果您正在创建、更新或删除表中的记录,那么您正在该表上执行事务。控制这些事务以确保数据完整性并处理数据库错误非常重要。

实际上,您会将许多 SQL 查询组合到一个组中,并将所有这些查询作为事务的一部分一起执行。

交易的属性

事务具有以下四个标准属性,通常由缩写词ACID指代。

  • Atomics性- 确保工作单元内的所有操作都成功完成。否则,事务将在故障点中止,并且之前的所有操作都将回滚到之前的状态。

  • 一致性- 确保数据库在成功提交事务后正确更改状态。

  • 隔离- 使事务能够独立运行且彼此透明。

  • 持久性- 确保已提交事务的结果或效果在系统发生故障时仍然存在。

事务控制命令

事务控制命令仅与DML 命令一起使用,例如 INSERT、UPDATE 和 DELETE。创建表或删除表时不能使用它们,因为这些操作会自动提交到数据库中。以下命令用于控制事务。

  • COMMIT - 保存更改。

  • ROLLBACK - 回滚更改。

  • SAVEPOINT - 在事务组中创建要回滚的点。

  • SET TRANSACTION - 在事务上放置名称。

提交命令

COMMIT 命令是用于保存事务调用的更改的事务命令。它保存自上次 COMMIT 或 ROLLBACK 以来数据库上发生的所有事务。

COMMIT 命令的语法如下。

COMMIT;

例子

首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表 -

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

我们正在将一些记录插入到上面创建的表中 -

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

该表将创建如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

以下查询将从表中删除 AGE 为 25 的记录,然后在数据库中提交更改。

DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;

确认

如果您使用 SELECT 语句验证 CUSTOMERS 表的内容,则表中的两行将被删除:

SELECT * FROM CUSTOMERS;

该表将显示如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
3 考希克 23 科塔 2000.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

回滚命令

ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。此命令只能撤消自上次 COMMIT 或 ROLLBACK 以来的事务。

ROLLBACK 命令的语法如下 -

ROLLBACK;

例子

考虑具有以下记录的 CUSTOMERS 表 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

以下查询将从表中删除 AGE 值为 25 的记录,然后回滚数据库中的更改。

DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;

确认

删除操作不会影响表,并且 SELECT 语句将产生以下结果。

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

保存点命令

SAVEPOINT 是事务中的逻辑回滚点。

通常,当您执行 ROLLBACK 命令时,它会撤消更改,直到最后一次 COMMIT。但是,如果您创建保存点,您可以将事务部分回滚到这些点。您可以在两次提交之间创建多个保存点。

在事务中创建 SAVEPOINT 的语法如下所示。

SAVEPOINT savepoint_name;

然后,要回滚到创建的 SAVEPOINT,您可以使用以下语法 -

ROLLBACK TO savepoint_name;

例子

以下是您计划从 CUSTOMERS 表中删除三个不同记录的示例。您希望在每次删除之前创建一个 SAVEPOINT,以便您可以随时 ROLLBACK 到任何 SAVEPOINT,将相应的数据返回到其原始状态。

考虑具有以下记录的 CUSTOMERS 表。

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

以下代码块包含这一系列操作。

SAVEPOINT SP1;
Query OK, 0 rows affected (0.00 sec)

DELETE FROM CUSTOMERS WHERE ID=1;
Query OK, 1 row affected (0.01 sec)

SAVEPOINT SP2;
Query OK, 0 rows affected (0.00 sec)

DELETE FROM CUSTOMERS WHERE ID=2;
Query OK, 0 rows affected (0.00 sec)

SAVEPOINT SP3;
Query OK, 0 rows affected (0.00 sec)

DELETE FROM CUSTOMERS WHERE ID=3;
Query OK, 1 row affected (0.01 sec)

现在已经进行了三个删除,让我们假设您改变了主意并决定回滚到您标识为 SP2 的保存点。因为 SP2 是在第一次删除后创建的,所以最后两次删除被撤消 -

ROLLBACK TO SP2;

确认

如果显示 CUSTOMERS 表,您会注意到自回滚到 SP2 以来仅发生了第一次删除。

ID 姓名 年龄 地址 薪水
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

RELEASE SAVEPOINT 命令

RELEASE SAVEPOINT 命令用于删除现有的 SAVEPOINT。

RELEASE SAVEPOINT 命令的语法如下。

RELEASE SAVEPOINT SAVEPOINT_NAME;

一旦 SAVEPOINT 被释放,您就不能再使用 ROLLBACK 命令来撤消自上次 SAVEPOINT 以来执行的事务。

SET TRANSACTION 命令

SET TRANSACTION 命令可用于启动数据库事务。该命令用于指定后续事务的特征。例如,您可以指定事务为只读或读写。

句法

SET TRANSACTION 命令的语法如下。

SET TRANSACTION [ READ WRITE | READ ONLY ];