Sql 简明教程
SQL - Transactions
SQL Transactions
事务是对数据库执行的一组或一系列工作。事务按逻辑顺序完成,无论是由用户手动完成还是由某种数据库程序自动完成。
事务是对数据库的一个或多个更改的传播。例如,如果您正在创建、更新或从表中删除记录,那么您正在对该表执行事务。控制这些事务以确保数据完整性和处理数据库错误非常重要。
实际上,您会将许多 SQL 查询合并到一个组中,并将它们全部作为一个事务的一部分一起执行。
Properties of Transactions
事务具有以下四个标准属性,通常用缩写词 ACID 表示。
-
Atomicity - 确保工作单元中的所有操作都成功完成。否则,事务将在故障点中止,所有先前操作将回滚到其以前的状态。
-
Consistency - 确保在成功提交事务后数据库正确更改状态。
-
Isolation - 使事务能够独立于彼此并对彼此透明地操作。
-
Durability - 确保已提交事务的结果或影响在系统故障的情况下持续存在。
Transactional Control Commands
事务控制命令仅与 DML Commands 一起使用,例如 INSERT、UPDATE 和 DELETE。在创建表或删除表时无法使用它们,因为这些操作会在数据库中自动提交。可以使用以下命令控制事务。
-
COMMIT - 保存更改。
-
ROLLBACK − 回滚更改。
-
SAVEPOINT − 在事务组中创建回滚点。
-
SET TRANSACTION − 为事务命名。
The COMMIT Command
COMMIT 命令是一个事务命令,用于保存因事务而引起的变化。它保存数据库中上次 COMMIT 或 ROLLBACK 之后发生的所有事务。
COMMIT 命令的语法如下。
COMMIT;
Example
首先,让我们使用以下查询创建名为 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 |
NAME |
AGE |
ADDRESS |
SALARY |
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;
COMMIT;
The ROLLBACK Command
ROLLBACK 命令是一个事务命令,用于撤消尚未保存到数据库的事务。此命令只能撤消上次 COMMIT 或 ROLLBACK 之后的事务。
ROLLBACK 命令的语法如下:
ROLLBACK;
Example
考虑包含以下记录的 CUSTOMERS 表:
ID |
NAME |
AGE |
ADDRESS |
SALARY |
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;
The SAVEPOINT Command
保存点是事务中的逻辑回滚点。
通常,当您执行 ROLLBACK 命令时,它将撤消直到上次 COMMIT 的更改。但是,如果您创建保存点,则可以将事务部分回滚到这些点。您可以在两次提交之间创建多个保存点。
在事务中创建 SAVEPOINT 的语法如下所示。
SAVEPOINT savepoint_name;
然后,要回滚到创建的 SAVEPOINT,您可以使用以下语法:
ROLLBACK TO savepoint_name;
Example
以下是一个计划从 CUSTOMERS 表删除三个不同记录的示例。你希望在每次删除前创建一个保存点,以便你能随时回滚到任何保存点,将其相应的数据返回到其初始状态。
可以将 CUSTOMERS 表视为包含以下记录。
ID |
NAME |
AGE |
ADDRESS |
SALARY |
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 的保存点。由于 SP2 是在第一次删除后创建的,因此会撤销最后两次删除操作 -
ROLLBACK TO SP2;