SQL - 事务



SQL 事务

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

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

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

事务的特性

事务具有以下四个标准属性,通常用首字母缩写词 **ACID** 来表示。

  • **原子性** - 确保工作单元中的所有操作都成功完成。否则,事务在故障点中止,所有先前操作都回滚到其先前状态。

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

  • **隔离性** - 使事务能够独立于彼此并且对彼此透明地运行。

  • **持久性** - 确保已提交事务的结果或效果在系统故障的情况下仍然存在。

事务控制命令

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

  • **COMMIT** - 保存更改。

  • **ROLLBACK** - 回滚更改。

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

  • **SET TRANSACTION** - 为事务命名。

COMMIT 命令

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 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

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

DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;

验证

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

SELECT * FROM CUSTOMERS;

表将显示如下:

ID 姓名 年龄 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
3 Kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

ROLLBACK 命令

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

ROLLBACK 命令的语法如下:

ROLLBACK;

示例

假设 CUSTOMERS 表具有以下记录:

ID 姓名 年龄 地址 薪水
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

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

DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;

验证

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

ID 姓名 年龄 地址 薪水
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

SAVEPOINT 命令

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

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

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

SAVEPOINT savepoint_name;

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

ROLLBACK TO savepoint_name;

示例

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

假设 CUSTOMERS 表具有以下记录。

ID 姓名 年龄 地址 薪水
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

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

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 的 SAVEPOINT。因为 SP2 是在第一次删除后创建的,所以最后两次删除被撤消了:

ROLLBACK TO SP2;

验证

如果您显示 CUSTOMERS 表,您可以注意到只有第一次删除发生了,因为您回滚到了 SP2。

ID 姓名 年龄 地址 薪水
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

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 ];
广告