📜  T-SQL-事务

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


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

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

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

交易性质

事务具有以下四个标准属性,通常由首字母缩写ACID引用-

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

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

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

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

交易控制

以下命令用于控制交易-

  • COMMIT-保存更改。

  • ROLLBACK-回滚更改。

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

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

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

为了在MS SQL Server中使用事务控制命令,我们必须以“ begin tran”开始事务或开始事务命令,否则这些命令将不起作用。

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的表中删除记录,然后在数据库中提交更改。

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

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是事务中的一个点,您可以将事务回滚到特定点而无需回滚整个事务。

句法

以下是SAVEPOINT命令的语法。

SAVE TRANSACTION 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 

以下是一系列操作-

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的语法。

SET TRANSACTION ISOLATION LEVEL