事务
事务
为什么要使用事务
比如:
银行转账
把你的钱拿出来 第一步失败了 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构