SQL - 事务

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

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

实际上,您将许多SQL查询添加到一个组中,并且您将一起执行所有这些查询作为交易的一部分.

交易属性

交易具有以下四种标准属性,通常用首字母缩略词 ACID .

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

  • 一致性 去;确保数据库在成功提交的事务中正确更改状态.

  • 隔离 : 使交易能够独立运作并相互透明.

  • 耐久性 : 确保在系统出现故障时,提交的事务的结果或效果仍然存在.

事务控制

以下命令用于控制交易.

  • COMMIT : 保存更改.

  • ROLLBACK : 回滚更改.

  • SAVEPOINT : 在ROLLBACK的交易组中创建点.

  • SET TRANSACTION : 在事务上放置名称.

事务控制命令

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

COMMIT命令

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

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的记录,然后在数据库中执行COMMIT更改.

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的记录,然后ROLLBACK数据库中的更改.

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,以便您可以随时ROLLBACK到任何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.

现在已经发生了三次删除,让我们假设您已经改变主意并决定ROLLBACK到您标识为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 ];