事务

事务

为什么要使用事务
比如:
银行转账
把你的钱拿出来 第一步失败了 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
posted @ 2021-10-24 11:41  青仙  阅读(38)  评论(0编辑  收藏  举报