Sql 简明教程

SQL - Transactions

SQL Transactions

事务是对数据库执行的一组或一系列工作。事务按逻辑顺序完成,无论是由用户手动完成还是由某种数据库程序自动完成。

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

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

Properties of Transactions

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

  1. Atomicity - 确保工作单元中的所有操作都成功完成。否则,事务将在故障点中止,所有先前操作将回滚到其以前的状态。

  2. Consistency - 确保在成功提交事务后数据库正确更改状态。

  3. Isolation - 使事务能够独立于彼此并对彼此透明地操作。

  4. Durability - 确保已提交事务的结果或影响在系统故障的情况下持续存在。

Transactional Control Commands

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

  1. COMMIT - 保存更改。

  2. ROLLBACK − 回滚更改。

  3. SAVEPOINT − 在事务组中创建回滚点。

  4. 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;

Verification

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

SELECT * FROM CUSTOMERS;

表将显示如下:

ID

NAME

AGE

ADDRESS

SALARY

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

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;

Verification

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

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

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;

Verification

如果你显示 CUSTOMERS 表,你可以注意到,由于您已回滚到 SP2,因此仅执行了第一次删除。

ID

NAME

AGE

ADDRESS

SALARY

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

The RELEASE SAVEPOINT Command

RELEASE SAVEPOINT 命令用于删除现有保存点。

RELEASE SAVEPOINT 命令的语法如下。

RELEASE SAVEPOINT SAVEPOINT_NAME;

一旦释放了保存点,就无法再使用 ROLLBACK 命令来撤消自上次保存点执行的事务。

The SET TRANSACTION Command

可以使用 SET TRANSACTION 命令来启动数据库事务。此命令用于为后续事务指定特征。例如,你可以将事务指定为只读或可读写。

Syntax

SET TRANSACTION 命令的语法如下。

SET TRANSACTION [ READ WRITE | READ ONLY ];