事务就是负责把一系列操作看做一个独立的逻辑单元,这些操作要么同时成功,要么同时失败。下面是一个经典的例子:
create procedure TransferMoeny(
@FromAccountNo varchar ( 50 ), -- 转出账号
@ToAccountNo varchar ( 50 ), -- 转入账号
@MoneyCount money -- 转账金额
)
as
-- 判断账号是否存在
if exists ( select 1 from 帐户表 where 账号 = @FromAccountNo )
begin
if exists ( select 1 from 帐户表 where 账号 = @ToAccountNo )
begin
-- 判断转出金额是否大于当前余额
if ( select 当前余额 from 帐户表 where 账号 = @FromAccountNo ) >= @MoneyCount
begin
-- 开始转账
begin transaction
insert into [ 存取记录表 ] ( [ 账号 ] , [ 存取类型 ] , [ 存取金额 ] ) values ( @FromAccountNo , - 1 , @MoneyCount )
if @@error <> 0
begin
rollback transaction -- 发生错误则回滚事务,无条件退出l
return
end
insert into [ 存取记录表 ] ( [ 账号 ] , [ 存取类型 ] , [ 存取金额 ] ) values ( @ToAccountNo , 1 , @MoneyCount )
if @@error <> 0
begin
rollback tran
return
end
commit transaction -- 两条语句都完成,提交事务
end
else
raiserror ( ' 转账金额不能大于该账号的余额 ' , 16 , 1 )
end
else
raiserror ( ' 转入账号不存在 ' , 16 , 1 )
end
else
raiserror ( ' 转出账号不存在 ' , 16 , 1 )