事务
1.什么是事务
事务就是被绑定在一起作为一个逻辑工作单元的SQL语
句,如果任何一个语句操作失败那么整个操作就被失败,
进而回滚到操作前状态,或者是上个节点。为了确保要么
执行,要么不执行,就可以使用事务。要将一组语句作为
事务考虑,就需要通过ACID测试,即原子性,一致性,隔
离性和持久性。
2.事务的四大特性
a. 原子性:
事务是一个不可分割的整体,为了保证事务的总体目标,
事务必须具有原子性,即当数据修改时,要么全执行,要
么全不执行,即不允许事务部分的完成不可能停滞在中间
某个环节。事务在执行过程中发生错误,会被回滚(Ro
llback)到事务开始前的状态,就像这个事务从来没有执
行过一样。
b.一致性:
在事务开始之前和事务结束以后,数据库的完整性约束没
有被破坏。
c.隔离性:
隔离状态执行事务,使它们好像是系统在给定时间内执行
的唯一操作。如果有两个事务,运行在相同的时间内,执
行 相同的功能,事务的隔离性将确保每一事务在系统中认
为只有该事务在使用系统。这种属性有时称为串行化,为
了防止事务操作间的混淆, 必须串行化或序列化请 求,
使得在同一时间仅有一个请求用于同一数据。
d.持久性:
在事务完成以后,该事务所对数据库所作的更改便持久的
保存在数据库之中,并不会被回滚。
3.案例
此处用到的表
A转账给B
我们就普通的转账而不用事务,就相当于是普通的修改,值也是需要手动去给的,然而用事务的话,我们就可以直接写个存储过程,然后自动调用,会简单很多
update Customers set Remain=remain-100
where NAME=A
update Customers set Remain=remain+100
where NAME=B
–用事务写
先创建一个存储过程,定义三个我们所需要的变量,转账的账号,收钱的账号,金额
alter proc cp_charge(
@idOut int,
@idIn int,
@remain decimal(18,2)
)
在开始事务,首先我们要定义变量去记录错误的数量,
就比如说 A转账给B,B没有收到,然而钱也没了,所以我们要用一个变量去接收这个错误的信息,
as
--张三转账给李四
--开始事务
begin Transaction tran_Chargc
--定义变量记录错误数
declare @err_nums int
set @err_nums=0
begin try
--开始转账(修改)
update Customers set Remain=remain-@remain
where id=@idOut
set @err_nums=@err_nums+@@error
update Customers set Remain=remain+@remain
where id=@idIn
set @err_nums=@err_nums+@@error
end try
begin catch
print '错误编号:'+convert(varchar,error_number())+'错误消息'+error_message()
set @err_nums=@err_nums+1
end catch
if(@err_nums>0) --说明语句有错
rollback Transaction tran_Chargc --回滚事务
else
commit Transaction tran_Chargc --提交事务
--调用存储过程
exec cp_charge 10,11,100
select * from Customers