T-SQL - 事务

  • 简述

    事务是针对数据库执行的工作单元。事务是按逻辑顺序完成的工作单元或序列,无论是用户手动方式还是某种数据库程序自动方式。
    事务是对数据库的一个或多个更改的传播。例如,如果您正在创建记录或更新记录或从表中删除记录,那么您正在对表执行事务。控制事务以确保数据完整性和处理数据库错误非常重要。
    实际上,您会将许多 SQL 查询组合成一个组,并将所有这些查询作为事务的一部分一起执行。
  • 事务属性

    事务具有以下四个标准属性,通常用首字母缩略词 ACID 表示 -
    • Atomicity− 确保工作单元内的所有操作都成功完成;否则,事务将在失败点中止,并且之前的操作将回滚到它们之前的状态。
    • Consistency− 确保数据库在成功提交事务后正确更改状态。
    • Isolation− 使事务能够独立运作并相互透明。
    • Durability− 确保已提交事务的结果或效果在系统故障的情况下持续存在。

    事务控制

    有以下命令用于控制事务 -
    • COMMIT− 保存更改。
    • ROLLBACK− 回滚更改。
    • SAVEPOINT− 在要回滚的事务组内创建点。
    • SET TRANSACTION− 在事务上放置名称。
    事务控制命令仅与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。在创建表或删除表时不能使用它们,因为这些操作会自动提交到数据库中。
    为了在 MS SQL Server 中使用事务控制命令,我们必须使用“begin tran”或 begin transaction 命令开始事务,否则这些命令将不起作用。
  • 提交命令

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

    句法

    以下是 COMMIT 命令的语法。
    
    COMMIT; 
    

    例子

    考虑具有以下记录的 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 命令是用于撤消尚未保存到数据库的事务的事务命令。此命令只能用于撤消自上次发出 COMMIT 或 ROLLBACK 命令以来的事务。

    句法

    以下是 ROLLBACK 命令的语法。
    
    ROLLBACK
    

    例子

    考虑具有以下记录的 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 是事务中的一个点,您可以在不回滚整个事务的情况下将事务回滚到某个点。

    句法

    以下是 SAVEPOINT 命令的语法。
    
    SAVE TRANSACTION SAVEPOINT_NAME
    
    此命令仅用于在事务语句之间创建 SAVEPOINT。ROLLBACK 命令用于撤销一组事务。
    以下是回滚到保存点的语法。
    
    ROLLBACK TO SAVEPOINT_NAME
    
    在下面的示例中,我们将从 CUSTOMERS 表中删除三个不同的记录。我们将必须在每次删除之前创建一个 SAVEPOINT,以便我们可以随时回滚到任何 SAVEPOINT 以将适当的数据返回到其原始状态。

    例子

    考虑具有以下记录的 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 命令可用于启动数据库事务。此命令用于指定后续事务的特征。

    句法

    以下是 SET TRANSACTION 的语法。
    
    SET TRANSACTION ISOLATION LEVEL <Isolationlevel_name>