SQL 事务处理

SQL 事务处理

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

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

在实际操作中,您会将许多SQL查询组合成一组,并将它们作为事务的一部分同时执行。

事务的属性

事务具有以下四个标准属性,通常被缩写为ACID。

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

  • Consistency(一致性) − 确保数据库在成功提交的事务后正确地变化状态。

  • Isolation(隔离性) − 使事务能够独立于并且对其他事务透明地进行操作。

  • Durability(持久性) − 确保在系统故障的情况下,已提交的事务的结果或效果能够持久存在。

事务控制

以下命令用于控制事务。

  • COMMIT(提交) − 用于保存更改。

  • ROLLBACK(回滚) − 用于撤销更改。

  • SAVEPOINT(保存点) − 在事务组中创建保存点以进行回滚。

  • SET TRANSACTION(设置事务) − 在事务上命名。

事务控制命令

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

COMMIT命令

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

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;

这个命令只在所有事务语句中创建保存点时使用。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 |
+----+----------+-----+-----------+----------+

以下代码块包含一系列操作。

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的保存点。因为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.

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程