事务(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