📜  SQL-交易

📅  最后修改于: 2020-12-29 04:41:30             🧑  作者: Mango


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

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

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

交易性质

事务具有以下四个标准属性,通常以首字母缩写ACID表示

  • 原子性-确保工作单元内的所有操作均成功完成。否则,事务将在失败点中止,并且所有先前的操作都将回滚到以前的状态。

  • 一致性-确保数据库在成功提交事务后正确更改状态。

  • 隔离-使事务能够独立运行并且彼此透明。

  • 持久性-确保在系统故障的情况下持久化已提交事务的结果或效果。

交易控制

以下命令用于控制事务。

  • COMMIT-保存更改。

  • ROLLBACK-回滚更改。

  • SAVEPOINT-在要回滚的事务组内创建点。

  • SET TRANSACTION-在交易上放置名称。

事务控制命令

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

COMMIT命令

COMMIT命令是用于将事务调用的更改保存到数据库的事务性命令。

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

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命令

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