SQL Server 事务(超级简单,人人都可以看懂)

事务(Transaction)

事务就是一个工作单元 ,如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久组成部分,如果事物中遇到错误且必须取消或回滚,则所有数据更改均被撤销。

为什么需要事务

例子:假定张三账户转1000块钱给李四账户

/* 为什么需要事务*/
/*-------------建表---------------*/
--同一银行,如果都是农行,都可以直接转。不是同一银行,跨行也可以转。
 --创建账户表 Bank
 create table Bank(
 customername char(10), --顾客姓名
 currentMoney money   --当前余额
 )
 go
/*---添加约束 根据银行规定,账户余额不能少于1元,除非注销账户---*/
 alter table bank
 add constraint ck_currentMoney check(currentMoney>=1)
 go
/*---插入测试数据,张三开户,存入1000。李四开户存入1元。---*/
insert into bank(customername,currentMoney)
values('张三',1000),
      ('李四',1)
go
 --查看结果
select * from bank

在这里插入图片描述
现在开始实现转账:张三账户开始向李四账户转入1000元。update语句修改张三账户和李四账户。张三账户减少1000,李四账户增加1000。显然结果不对,张三账户为:1000,李四账户为1001。
在这里插入图片描述
在这里插入图片描述
我们一起来分析错误吧。因为执行update语句有错,执行违反了ck_currentMoney 约束。即是账户余额不能低于1元。所以张三的账户减少1000出错了。

什么是事务

1.事务是一种机制,是一种操作序列。它包含了一组数据库操作密令。并且所有的密令作为一个整体,一起向系统提交或者撤销操作请求。这一组密令要么执行,要么不执行。

2.特别适用于多用户同时操作数据库系统,例如:航空系统订票 银行 保险公司 证券 等等

3.事务是作为单个逻辑工作 单元执行的一系列操作,一个逻辑工作单元必须有四个属性,原子性 一致性 隔离性 持久性 这些特性通常称为ACID

如何创建事务

–1.开始事务:BEGIN TRANSACTIONS
–2.提交事务:COMMIT TRANSACTIONS
–3.回滚(撤销)事务 ROLLBACK TRANSACTIONS

事务的分类

1.显式事务:用BEGIN TRANSACTIONS 明确指定事务的开始
2.隐形事务: 通过设置 SET IMPLICIT_TRANSACTIONS ON 语句 将隐性模式设置打开 当以隐性事务操作时,SQL SERVER 将在提交或回滚事务启动新事务。无需描述事务的开始,只需要提交或回滚每个事务。
3.自动提交事务:这是 SQL SERVER 的默认模式,他将每条单独的T-SQL视为一个事务,如果成功执行,则自动提交,如果执行时出现错误,则自动回滚。

了解事务分类即可,实际开发最常用的就是显式事务,他明确的指定事务开始的边界。

--恢复原来的数据
--不显示受影响的行数据信息
update Bank
set currentMoney=currentMoney-1000
where customername='李四'
go

set nocount on 
print '查看转账事务的前余额'
select * from Bank
/*开始执行事务信息,指定事务从此处开始,后面的T-SQL都是一整体*/
begin transaction 
/*定义变量,用于累计执行事务错误的次数*/
declare @errorSum int
set @errorSum=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
go
print '查看事务后转账的余额'
select * from Bank
go

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值