T-SQL 事务

2018-12-14 16:51 更新

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

事务是将一个或多个执行命令发送到数据库。例如,你正在创建记录,修改记录或者从表中删除记录,这些行为都是对表进行事务操作。事务对于确保数据完整性和处理数据库错误是非常重要的。

实际上,你常常会将许多SQL操作分成一组事务一起执行。

事务属性

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

  • 原子性 -确保工作单元内的所有操作成功完成; 否则,事务在故障点处中止,并且先前的操作被回滚到它们的原先状态。

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

  • 隔离性 -事务之间是独立运行互不相关的。

  • 持久性 -事务一旦被执行,即使系统故障,其结果依然有效。

事务控制

一下命令用于控制事务

  • COMMIT-提交事务。

  • ROLLBACK -回滚事务。

  • SAVEPOINT -创建事务的回滚节点。

  • SET TRANSACTION -设置事务名称。

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

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

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 

以下命令示例将从删除从CUSTOMERS表中删除所有年龄等于25的用户记录。

Begin Tran 
DELETE FROM CUSTOMERS 
   WHERE AGE = 25 
COMMIT 

上述命令将产生以下结果集:

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 

下面的命令将从CUSTOMERS表中删除年龄等于25的用户记录,然后使用ROLLBACK命令,回滚数据。

Begin Tran 
DELETE FROM CUSTOMERS 
   WHERE AGE = 25; 
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 

SAVEPOINT命令

SAVEPOINT命令可以使事务回滚到某个点节点,而不回滚整个事务。

语法

以下是SAVEPOINT命令的语法。

SAVE TRANSACTION SAVEPOINT_NAME

此命令仅用于在事务语句之间创建SAVEPOINT。 ROLLBACK命令用于撤消一组事务。

以下是回滚到一个事务节点的语法。

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 

以下是一系列操作

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.

三个删除已经发生,但是,我们改变了主意,决定ROLLBACK到SAVEPOINT,我们确定为SP2。 因为SP2是在第一次删除后创建的,所以最后两个删除被撤消

ROLLBACK Transaction SP2 
Rollback complete. 

请注意,我们回滚到SP2后,相当于只发生了第一次删除。

SELECT * FROM CUSTOMERS 

查询后的结果为6条记录:

ID  NAME       AGE       ADDRESS          SALARY 
2   Khilan     25        Ahmedabad        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 <Isolationlevel_name>

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号