create table Account
(
AccountNumber varchar(20) not null primary key, --卡号
AccountName varchar(20) not null, --用户姓名
Balance decimal(18,2) not null check(Balance>=0) --余额
)
--创建数据
insert into
Account values(123456,'祝红涛',499.00)
insert into
Account values(654321,'张浩太',500.00)
select * from Account
--修改数据
alter table Account
with check
add check(Balance>0 and Balance<1000)
下面这里的会出现支出方支出钱,但卡里钱没被扣的问题。
declare @outCard varchar(20) --转出账号
declare @inCard varchar(20) --转入账号
declare @money decimal(18,2) --转出金额
--变量赋值
set @outCard='123456'
set @inCard='654321'
set @money=500
--增加金额
update Account
set Balance=Balance+@money --余额=余额+500
where AccountNumber=@inCard --卡号=转入账号 @inCard=500+500=1000
--减少金额
update Account
set Balance=Balance-@money --余额=余额-500
where AccountNumber=@outCard --卡号=转出账号 @outCard=499-500=-1 但有约束不允许小于0所以@outCard余额不变
select * from Account
这里解决了上面出现的问题,银行支出的事务回滚。更安全的解决了出现支出钱,但支出方卡里没被扣钱的现状。
go
--利用事务来处理所出现的问题
select * from Account
--声明变量
declare @Err int,@Arr int
declare @outCard varchar(20) --转出账号
declare @inCard varchar(20) --转入账号
declare @money decimal(18,2) --转出金额
--变量赋值
set @outCard='123456'
set @inCard='654321'
set @money=500
begin transaction
--增加金额
update Account
set Balance=Balance+@money --余额=余额+500
where AccountNumber=@inCard --卡号=转入账号 @inCard=500+500=1000 但有约束不允许大于1000所以@intCard余额不变
set @Err=@@ERROR
--减少金额
update Account
set Balance=Balance-@money --余额=余额-500
where AccountNumber=@outCard --卡号=转出账号 @outCard=499-500=-1 但有约束不允许小于0所以@outCard余额不变
set @Arr=@@ERROR
if @Err=0 and @Arr=0
begin
commit transaction --提交事务
print '事务提交成功'
end
else
begin
rollback transaction --事务回滚
print '事务回滚'
end
--查询数据库表内容
select * from Account