SQL事务

本文详细介绍了SQL事务的基本概念,包括事务的原子性、一致性、隔离性和持久性四大属性。此外,还阐述了如何通过BEGIN、ROLLBACK、COMMIT以及SAVEPOINT等命令进行事务处理,并强调了事务控制命令只能与DML命令配合使用,不能应用于DDL操作。通过举例说明了SAVEPOINT在回滚事务中的应用,以及SET TRANSACTION命令在设定事务特性中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、事务
1.1事务是针对数据库执行的工作单元。 事务是以逻辑顺序完成的单元或工作序列,无论是以用户的手动方式还是以某种数据库程序自动进行。事务是将一个或多个执行命令发送到数据库。例如,你正在创建记录,修改记录或者从表中删除记录,这些行为都是对表进行事务操作。事务对于确保数据完整性和处理数据库错误是非常重要的。实际上,你常常会将许多SQL操作分成一组事务一起执行。

1.2事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。1.3 事务属性

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

二、事务处理主要方法:
2.1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务

ROLLBACK 事务回滚

COMMIT 事务确认

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

SET TRANSACTION -设置事务名称。注意:事务控制指令只能用DML命令使用INSERT,UPDATE和DELETE只。它们不能在创建表或删除它们,因为这些操作都是自动提交到数据库中。

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

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

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

2.4 语法
以下是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>

事务的范例

PRINT  '查看当前余额'

select * from bank 

 

BEGIN TRANSACTION \\开始事务

DECLARE @errsum INT\\定义自定义变量,用来记录语句报错的总值

SET @errsum=0\\设置变量的初始值

 

update bank set money=money-300 where name='liyouwei'\\执行语句

SET @errsum=@errsum+@@ERROR\\统计语句执行中的报错,并赋值给自定义变量

\\@@ERROR是系统变量,用来记录每条语句执行中的报错次数
 

update bank set money=money+300 where name='haohao'

SET @errsum=@errsum+@@ERROR

 

print '转账中'

 

if @errsum<>0\\判断语句

BEGIN\\功能模块开始

print'你有多钱心里还没点13数嘛?'

ROLLBACK TRANSACTION\\回滚,撤销以上所有操作

END\\功能模块结束

ELSE\\否则

BEGIN

print '转账成功'

COMMIT TRANSACTION\\提交确认以上所有语句的操作

END

print ‘转账后余额查询’

select * from bank
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值