T Sql 简明教程

T-SQL - Transactions

transaction 是针对数据库执行的一项工作单元。事务是由用户手动或由某种数据库程序自动以逻辑顺序执行的工作单元或工作序列。

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

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

Properties of Transactions

事务具有以下四个标准属性,通常用首字母缩写词 ACID 提到 -

  1. Atomicity − 确保工作单元内的所有操作都已成功完成;否则,事务将中止于故障点,之前的操作将回滚至其原有状态。

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

  3. Isolation − 使得事务能够彼此独立且透明地操作。

  4. Durability − 确保在系统故障的情况下,已提交事务的结果或效果会持续存在。

Transaction Control

有以下用于控制事务的命令 −

  1. COMMIT − 保存更改。

  2. ROLLBACK − 回滚更改。

  3. SAVEPOINT − 创建可执行 ROLLBACK 的事务分组内的点。

  4. SET TRANSACTION − 为事务命名。

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

为了在 MS SQL Server 中使用事务控制命令,我们必须使用“begin tran”或“begin transaction”命令开始事务,否则这些命令将不起作用。

COMMIT Command

COMMIT 命令用于将由事务调用的更改保存到数据库的事务命令。此命令将自上次 COMMIT 或 ROLLBACK 命令以来所有事务保存到数据库。

Syntax

以下是 COMMIT 命令的语法。

COMMIT;

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        MP                4500.00
7   Muffy      24        Indore            10000.00

以下命令示例将从表中删除年龄 = 25 的记录,然后在数据库中提交更改。

Begin Tran
DELETE FROM CUSTOMERS
   WHERE AGE = 25
COMMIT

最后将从表中删除两行,并且 SELECT 语句将生成以下输出。

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        MP                4500.00
7   Muffy      24        Indore            10000.00

ROLLBACK Command

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

Syntax

以下是 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        MP                 4500.00
7   Muffy      24        Indore             10000.00

以下命令示例将从表中删除年龄 = 25 的记录,然后在数据库中回滚更改。

Begin Tran
DELETE FROM CUSTOMERS
   WHERE AGE = 25;
ROLLBACK

最后,删除操作将不影响表,并且 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        MP               4500.00
7   Muffy      24        Indore           10000.00

SAVEPOINT Command

SAVEPOINT 是事务中的一个点,在该点上您可以将事务回滚到某个点,而无需回滚整个事务。

Syntax

以下是 SAVEPOINT 命令的语法。

SAVE TRANSACTION SAVEPOINT_NAME

此命令仅用于在事务语句中创建 SAVEPOINT。ROLLBACK 命令用于撤消一组事务。

以下是回滚到 SAVEPOINT 的语法。

ROLLBACK TO SAVEPOINT_NAME

在以下示例中,我们将从 CUSTOMERS 表中删除三条不同的记录。在每次删除之前,我们都必须创建一个 SAVEPOINT,以便我们可以在任何时间回滚到任何 SAVEPOINT,以将适当的数据返回到其原始状态。

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        MP               4500.00
7   Muffy      24        Indore           10000.00

以下是操作系列:

Begin Tran
SAVE Transaction SP1
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 1
1 row deleted.
SAVE Transaction SP2
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 2
1 row deleted.
SAVE Transaction SP3
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 3
1 row deleted.

这三个删除操作已经发生,但是,我们改变了主意并决定回滚到我们标识为 SP2 的 SAVEPOINT。因为 SP2 是在第一次删除后创建的,所以最后两个删除操作被撤消了 -

ROLLBACK Transaction SP2
Rollback complete.

请注意,由于我们回滚到了 SP2,因此只执行了第一次删除。

SELECT * FROM CUSTOMERS

选择了 6 行。

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        MP               4500.00
7   Muffy      24        Indore           10000.00

SET TRANSACTION Command

SET TRANSACTION 命令可用于启动数据库事务。此命令用于指定后续事务的特性。

Syntax

以下是 SET TRANSACTION 的语法。

SET TRANSACTION ISOLATION LEVEL <Isolationlevel_name>