SQLServer事务
一.事务
1.概念与意义
我们需要在SQLServer中将一系列操作同时进行,在进行的过程中必须要保证这一系列操作全部成功,否则就相当于是全部失败,不可能出现一部分操作成功,一部分操作失败的情况,这样的一系列操作就是事务
那么事务的作用是什么呢?在事务的这一系列操作中,如果第一个操作就失败,那么后面的操作即使成功也没有了意义,或者说那是错误混乱的数据,例如:
小明拥有五个苹果,他想要拿出八个苹果(不得小于八个苹果,否则分享失败)与朋友分享,同时他会写下日记记录与朋友分享的这件事,在这里,事务中只有两项操作,一是拿出八个苹果与朋友分享,二是写下日记,可是问题是小明只拥有五个苹果,他根本没办法完成分享八个苹果的操作,但是要是第一个分享苹果的操作失败,第二个写日记记录与朋友分享苹果的操作又成功了,这不是造假了吗?
所以,在事务中的一系列操作的关系是一荣俱荣一损俱损的
2.案例
在开始之前我们需要知道一个事务的开始需要用
begin tansaction作为开头
同时,在其中会自动定义一个全局变量为@@ERROR,其中存储的数据类型为int,存储的数据表示的是出错的代码编号,我们常用这一特性检测代码是否出错
比如:
declare @E int = 0
--代码段1
set @E = @E + @@ERROR --检测代码段一是否报错
--代码段2
set @E = @E + @@ERROR --检测代码段二是否报错
print @E
例如:
小明有五个苹果,他想凑齐八个苹果与朋友分享,并将支出记录下来(使用check约束保证账户余额必须大于等于0)
begin transaction
update People set Apple = Apple - 8 where Id = '001'--Pepple表中的Apple苹果个数
insert into Record(Id,Rest,Give,ChangeTime)--Record获得与支出的记录,Rest剩余苹果个数,Give给出苹果个数,ChangeTime苹果个数改变时间
values('001',5,8,GETDATE())
set @E = @E + @@ERROR
if @E = 0
begin
commit transaction
print '操作成功'
end
else
begin
rollback transaction
print '操作失败'
end
注意点:我们使用了if,else判断语句对代码是否报错进行判断,如果判断是没有报错那么就commit transaction,对其执行,并留下相应的记录,但是如果报错,这一系列事务中就有问题,那么就将rollback transaction,将其抛回,并不执行,也不会留下记录