/*-- 创建表 --*/
--创建农行账户表bank
if exists(select * from sysobjects where name='bank')
drop table bank
go
create table bank
(
customerName char(10), --顾客姓名
currentMoney money --当前余额
)
/*-- 添加约束:根据银行规定,账户余额不能少于1元,否则视为销户 --*/
alter table bank
add constraint CK_currentMoney check(currentMoney>=1)
/*-- 插入测试数据:张三开户,开户金额为800,李四开户,开户金额1 --*/
insert into bank(customerName,currentMoney) values('张三',1000)
insert into bank(customerName,currentMoney) values('李四',1)
--查看结果
select * from bank
go
/*-- 转账测试:张三希望通过转账,直接汇钱给李四1000元 --*/
set nocount on --不显示受影响的行数信息
print '查看转账事务前的余额'
select * from bank
go
/*-- 开始事务 --*/
begin transaction
/*-- 定义变量,用于累计事务执行的过程中的错误 --*/
declare @errorSum int
set @errorSum=0 --初始化为0,即无错误
/*-- 转账 --*/
update bank set currentMoney=currentMoney-1000 where customerName='张三'
set @errorSum=@errorSum+@@error --累计是否有错误
update bank set currentMoney=currentMoney+1000 where customerName='李四'
set @errorSum=@errorSum+@@error --累计是否有错误
print '查看转账事务过程中的余额'
select * from bank
/*-- 根据是否有错误,确定事务是提交还是撤销 --*/
if @errorSum<>0 --如果有错误
begin
print '交易失败,回滚事务'
rollback transaction
end
else
begin
print '交易成功,提交事务,写入硬盘,永久保存'
commit transaction
end
print '查看转账事务后的余额'
select * from bank
go