SQL - 事务

  • 简述

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

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

    事务控制

    以下命令用于控制事务。
    • COMMIT- 保存更改。
    • ROLLBACK- 回滚更改。
    • SAVEPOINT- 在要回滚的事务组内创建点。
    • SET TRANSACTION- 在事务上命名。
  • 事务控制命令

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

    提交命令

    COMMIT 命令是用于将事务调用的更改保存到数据库的事务命令。
    COMMIT 命令是用于将事务调用的更改保存到数据库的事务命令。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 的那些记录,然后提交数据库中的更改。
    
    SQL> DELETE FROM CUSTOMERS
       WHERE AGE = 25;
    SQL> 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 的那些记录,然后回滚数据库中的更改。
    
    SQL> DELETE FROM CUSTOMERS
       WHERE AGE = 25;
    SQL> 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 命令的语法如下所示。
    
    SAVEPOINT SAVEPOINT_NAME;
    
    此命令仅用于在所有事务语句中创建 SAVEPOINT。ROLLBACK 命令用于撤消一组事务。
    回滚到 SAVEPOINT 的语法如下所示。
    
    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 |
    +----+----------+-----+-----------+----------+
    
    以下代码块包含一系列操作。
    
    SQL> SAVEPOINT SP1;
    Savepoint created.
    SQL> DELETE FROM CUSTOMERS WHERE ID=1;
    1 row deleted.
    SQL> SAVEPOINT SP2;
    Savepoint created.
    SQL> DELETE FROM CUSTOMERS WHERE ID=2;
    1 row deleted.
    SQL> SAVEPOINT SP3;
    Savepoint created.
    SQL> DELETE FROM CUSTOMERS WHERE ID=3;
    1 row deleted.
    
    现在三个删除已经发生,让我们假设您已经改变主意并决定回滚到您标识为 SP2 的 SAVEPOINT。因为 SP2 是在第一次删除后创建的,所以最后两次删除被撤消 -
    
    SQL> ROLLBACK TO SP2;
    Rollback complete.
    
    请注意,自从您回滚到 SP2 后,只发生了第一次删除。
    
    SQL> SELECT * FROM CUSTOMERS;
    +----+----------+-----+-----------+----------+
    | 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 |
    +----+----------+-----+-----------+----------+
    6 rows selected.
    

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