T-SQL事务
Transaction(事务)是针对数据库执行的工作单元。任何读取或写入数据库的事务。
事务是一项或多项更改数据库的操作。
例如,如果我们正在记录、更新或删除表的历史记录,则创建表的事务。为了控制数据完整性的操作,它用于处理数据库的错误。我们将一些SQL查询添加到组中并执行事务部分。
事务的特性:
事务具有四个属性,这些属性被称为ACID属性-
- 原子性(Atomicity) – 确保工作单元的所有操作成功完成;否则,事务将在失败点被取消,并且最早的活动将移回到以前的位置。这意味着要么全部成功要么全部失败。
- 一致性(Consistency) – 这确保了成功提交事务后,数据库正确地更改了状态。
- 持久性(Durability) – 将数据库从一个一致的状态带到另一个稳态,确保将数据库从一个稳态传递到另一个稳态。
- 隔离性(Isolation) – 隔离性确保一个事务与其他事务不同。这使得操作能够彼此透明地工作。
- 稳定性(Stability) – 在系统故障的情况下,它确保提交的事务的结果或影响。稳定性意味着一旦完成事务,它就会在错误、断电等情况下保持不变。
事务控制
以下是用于控制事务的命令:
- COMMIT(提交) – 用于保存更改。
- ROLLBACK(回滚) – ROLLBACK用于撤消尚未保存到数据库的事务。Rollback命令用于撤消一组操作。
- SAVEPOINT(保存点) – SAVEPOINT通过rollback命令创建事务组。
- SET TRANSACTION(设置传输) – 返回事务的名称。
事务命令与DML命令(如INSERT、UPDATE和DELETE)一起使用。当我们创建或删除表时,不能应用它们。
在MS SQL Server中,要使用事务控制命令,我们需要启动’trans start’或transaction命令;否则该命令可能无效。
COMMIT命令
它也称为Transactional Command(事务命令)。数据库使用该命令保存更改。
语法:
下面是COMMIT命令的语法。
COMMIT;
例子
请参阅以下记录的EMPLOYEES表:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Hamilton | 23 | Australia | 34000 |
2 | Warner | 34 | England | 22000 |
3 | Martin | 28 | China | 25000 |
4 | Twinkle | 30 | Turkey | 50000 |
5 | Tinu | 32 | Nepal | 45000 |
6 | Michal | 31 | Bhutan | 20000 |
7 | Harper | 20 | Bangladesh | 15000 |
以下命令示例将从具有AGE = 30的表中删除记录,然后提交对数据库的更改。
Begin Tran
DELETE FROM EMPLOYEES WHERE AGE = 30;
COMMIT;
在结果部分,表中的第4行和第6行已被删除。SELECT语句生成以下输出:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Hamilton | 23 | Australia | 34000 |
2 | Warner | 34 | England | 22000 |
3 | Martin | 28 | China | 25000 |
5 | Tinu | 32 | Nepal | 45000 |
7 | Harper | 20 | Bangladesh | 15000 |
ROLLBACK命令
ROLLBACK命令用于撤消尚未保存到数据库的事务。它用于回滚一组操作。
语法:
下面是ROLLBACK命令的语法。
ROLLBACK;
例子
请参阅以下记录的EMPLOYEES表:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Hamilton | 23 | Australia | 34000 |
2 | Warner | 34 | England | 22000 |
3 | Martin | 28 | China | 25000 |
4 | Twinkle | 30 | Turkey | 50000 |
5 | Tinu | 32 | Nepal | 45000 |
6 | Michal | 31 | Bhutan | 20000 |
7 | Harper | 20 | Bangladesh | 15000 |
假设我们想要删除具有ID = 3和ID = 7的两个记录。
在初始状态下,使用以下命令开始事务。
BEGIN TRANSACTION;
现在,执行以下语句删除具有ID = 3和ID = 7的两个记录。
DELETE FROM EMPLOYEES WHERE ID IN (3,7);
现在,使用ROLLBACK命令撤消该事务,如下所示。
ROLLBACK;
现在,选择从表中查看所有记录,我们可以看到ID = 3和ID = 7的两行仍存在,并且未从数据库中删除。
SAVEPOINT命令
SAVEPOINT命令通过rollback命令创建事务组。它用于将一个事务分成多个可回滚的部分。
语法:
下面是SAVEPOINT命令的语法。
SAVEPOINT SAVEPOINT_NAME;
例子
请参阅以下记录的EMPLOYEES表:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Hamilton | 23 | Australia | 34000 |
2 | Warner | 34 | England | 22000 |
3 | Martin | 28 | China | 25000 |
4 | Twinkle | 30 | Turkey | 50000 |
5 | Tinu | 32 | Nepal | 45000 |
6 | Michal | 31 | Bhutan | 20000 |
7 | Harper | 20 | Bangladesh | 15000 |
假设我们要删除具有ID = 3和ID = 7的两条记录,并使用SAVEPOINT将事务拆分为可回滚的部分。
首先,执行BEGIN TRANSACTION语句开始事务。
BEGIN TRANSACTION;
接下来,执行以下命令,从表中删除ID为3的记录。
DELETE FROM EMPLOYEES WHERE ID = 3;
现在,我们使用SAVEPOINT命令创建名为’SP1’的保存点。
SAVEPOINT SP1;
接下来,执行以下语句,从表中删除ID为7的记录。
DELETE FROM EMPLOYEES WHERE ID = 7;
如果我们想要回滚到SAVEPOINT名为SP1的状态,则可以使用以下rollback命令。
ROLLBACK TO SP1;
这会撤消DELETE语句的效果,因此表将只包含具有ID = 3、ID = 4和ID = 5的三个记录。
现在,执行COMMIT或ROLLBACK语句来提交或回滚事务。例如,执行COMMIT语句以永久删除表的ID=3和ID=7行。
COMMIT;
SET TRANSACTION命令
SET TRANSACTION命令用于返回事务的名称。它允许我们指定一个表示事务的名称。
语法:
下面是SET TRANSACTION命令的语法。
SET TRANSACTION ISOLATION LEVEL <level_name>