事务经典例子

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

ALTER proc dbo.XT_JFDHZP
@djbh varchar(11)

as

--启动事务处理
declare @return int
set @return=0
declare @tran_point int --控制事务嵌套
set @tran_point=@@trancount --保存事务点
if @tran_point=0
begin tran tran_jfdh
else
save tran tran_jfdh

INSERT INTO [jfdhhz]([djbh],[rq],[sj],[fdmc],[czry],[hykh],[hyjf],[zzjf],jtjf, zbjf,[cardid],syjf)
select [djbh],[rq],[sj],[fdmc],[czry],[hykh],[hyjf],[zzjf],jtjf, zbjf,[cardid],syjf from [Lsb_jfdhhz] where djbh=@djbh
if @@error <> 0 or @@rowcount <> 1 ---汇总超过1条就报错
begin
set @return=1
goto err_lab
end

INSERT INTO [jfdhmx]([djbh],[hh],[zpid],[zpbh],[zpmc],[sxjf],[hyjf],[sl],[bz])
select [djbh],[hh],[zpid],[zpbh],[zpmc],[sxjf],[hyjf],[sl],[bz] from [Lsb_jfdhmx] where djbh=@djbh
if @@error <> 0 or @@rowcount = 0
begin
set @return=2
goto err_lab
end

--纸张积分
declare @zzjf decimal
set @zzjf=(select sum([zzjf]) from [Lsb_jfdhhz] where djbh=@djbh)

--兑换明细所需积分总和
declare @jifen decimal
set @jifen=(select sum(sxjf) from Lsb_jfdhmx where djbh=@djbh)-@zzjf

--判断所需积分为负数就为零,防止可以重加积分
if @jifen<=0
begin
set @return=3
goto err_lab
end


declare @cardid varchar(20)
set @cardid=(select cardid from Lsb_jfdhhz where djbh=@djbh)

declare @huiyuanjifen decimal
set @huiyuanjifen=(select jifen from lscard where cardid = @cardid)

update lscard set jifen =jifen-@jifen where cardid = @cardid and beactive = '是'
if @@error <> 0 or @@rowcount = 0
begin
set @return=4
goto err_lab
end

declare @huiyuanjifen2 decimal
set @huiyuanjifen2=(select jifen from lscard where cardid = @cardid)

if(@huiyuanjifen2+@jifen <> @huiyuanjifen)

if @@error <> 0
begin
set @return=5
goto err_lab
end

delete Lsb_jfdhhz where djbh=@djbh
if @@error <> 0
begin
set @return=6
goto err_lab
end
delete Lsb_jfdhmx where djbh=@djbh
if @@error <> 0
begin
set @return=7
goto err_lab
end


--事务处理
if @tran_point=0
commit tran tran_jfdh
goto return_lab

err_lab:
rollback tran tran_jfdh
return @return

return_lab:
return
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 

转载于:https://www.cnblogs.com/leejunxu/archive/2012/10/10/2718533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值