mysql 事务 银行转账_银行转账(跨库事务)

use BankSystem

use master

go

create DataBase BankSystem

go

use BankSystem

go

create table CardInfo

(

PKID int identity(1,1) primary key ,

CardNum nvarchar(19) not null,            --卡号

Balance money default(0)                  --余额

)

go

create table Transfer_Event

(

PKID int identity(1,1) primary key,

FromCardID nvarchar(19) not null,        --源卡号

ToCardID nvarchar(19) not null,          --目标卡号

TransMoney money,                        --转账金额

OccurTime datetime                       --发生时间

)

--插入记录

insert into CardInfo(CardNum,Balance) values('123456789',80.8)

insert into CardInfo(CardNum,Balance) values('123',10.9)

go

--实现转账过程的存储过程实现如下(成功返回0,余额不够返回1,出现异常返回2)

create procedure TranserMoney

(

@fromCardNum varchar(19),        --转账源卡号

@toCardNum  varchar(19),         --转账目标卡号

@tansMoney Money,                --转账金额

@occurTime DateTime              --转账时间

)

as

begin

declare @cardNum varchar(19)

declare @balance Money

--开始事务

begin transaction

--定义游标

declare cursorTransfer cursor for select CardNum,Balance from CardInfo where CardNum=@fromCardNum

--打开游标

open cursorTransfer

--取字段值,放入@cardNum,@balance

fetch next from cursorTransfer into @cardNum,@balance

while @@FETCH_STATUS=0   --取游标状态(0--表示成功)

begin

if(@balance>=@tansMoney)  --判断余额是否大于转账金额

begin

update CardInfo set Balance=Balance-@tansMoney where CardNum=@fromCardNum

if @@ERROR<>0 goto ERR --发生错误跳转

update CardInfo set Balance=Balance+@tansMoney where CardNum=@toCardNum

if @@ERROR<>0 goto ERR

insert into Transfer_Event(FromCardID,ToCardID,TransMoney,OccurTime)values(@fromCardNum,@toCardNum,@tansMoney,@occurTime)

if @@ERROR<>0 goto ERR

commit transaction   --提交事务

close cursorTransfer --关闭游标

deallocate cursorTransfer

return 0    --执行正常,返回0

end

else  --金额不够,返回1,回滚事务

begin

rollback transaction   --回滚事务

close cursorTransfer --关闭游标

deallocate cursorTransfer

return 1    --执行正常,返回0

end

end

end

ERR:--发生异常返回2

begin

rollback transaction  --回滚事务

close cursorTransfer

deallocate  cursorTransfer

return 2

end

go

--调用存储过程

declare @fromCardNum nvarchar(19),@toCardNum nvarchar(19),@money money,@dateTime DateTime,@flag int

set @fromCardNum='123456789'

set @toCardNum='123'

set @dateTime='2009-7-17'

set @money=50

exec @flag= TranserMoney @fromCardNum,@toCardNum,@money,@dateTime

select @flag

select *from CardInfo;

select *from Transfer_Event;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值