事务
事务
为什么要使用事务
比如:
银行转账
把你的钱拿出来 第一步失败了 update money set money=money-100
把钱转到对方账户 第二步成功了 update money set money=money+100
这样就会出现问题,钱没有扣,对方账户余额却增加了
什么是事务:
把所有的操作当中一个整体,要么全部成功,要么全部失败,一旦开启了事务所有的操作都是临时的,你可以选择提交或者回滚
提交事务:全部成功
回滚事务:全部失败
事务特性(ACID):
事务具有原子性,一致性,隔离性,持久性(ACID)
A 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
C 一致性:事务把数据库从一个一致状态带入到另一个一致状态,事务结束的时候,所有的内部数据都是正确的。
I 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。
D 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响。
使用事务的步骤:
1:开启事务 begin trans/transaction 事务名称
2:提交事务 commit trans/transaction 事务名称
3: 回滚事务 rollback rollback/transaction 事务名称
结合捕捉异常来使用事务:
捕捉异常结构如下:
begin try
.....x写语句........
end try
begin catch
只要出错到catch语句
end catch
比如:
--开始尝试
begin try
--开启事务
begin transaction trans_1
declare @num int
select @num=COUNT(*) from USerinof where number=@card1--查找你的账户
if(@num=0)--判断你账户是否存在
begin
print('你的账号不存在')
commit transaction trans_1 --提交事务
return
end
select @num=COUNT(*) from USerinof where number=@card2--查找对方的账户
if(@num=0)--判断对方账户是否存在
begin
print('对方账号不存在')
commit transaction trans_1 --提交事务
return
end
if(@money=0)
begin
print('转账金额必须大于0')
commit transaction trans_1 --提交事务
return
end
declare @money2 int --定义用来接收用户输入账号的余额
select @money2=usemoney from USerinof where number=101--查询余额
if @money2<@money
begin
print('余额不足')
commit transaction trans_1 --提交事务
return
end
update USerinof set usemoney=usemoney+@money where number=@card1
update USerinof set usemoney=usemoney-@money where number=@card2
print('转账成功')
commit transaction trans_1 --提交事务
end try
----错误尝试
begin catch
rollback transaction trans_1 --回滚事务
end catch
传统方式使用
--@@ERROR:记录异常的常量,没有异常时,返回值是0
--假设刘备取款6000,(添加check约束,设置账户余额必须>=0)
--要求:使用事务实现,修改余额和添加取款记录两步操作使用事务
begin transaction
declare @MyError int = 0
update BankCard set CardMoney = CardMoney-6000 where CardNo = '6225125478544587'
set @MyError = @MyError + @@ERROR
insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)
values('6225125478544587',0,6000,GETDATE())
set @MyError = @MyError + @@ERROR
if @MyError = 0
begin
commit transaction
print '取款成功'
end
else
begin
rollback transaction --回滚事务
print '余额不足'
end