什么是事务?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试。
事务的特性
原子性,一致性,隔离性和持久性。
原子性。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性。事务必须是数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性。持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
如何使用使用事务
Customer表格
列名 | 数据类型 |
---|---|
ID | int |
Name | varchar(50) |
Remain | decimal(18, 2) |
创建存储过程
create proc cp_changeAcount
(
@idOut int,
@idIn int,
@Remain decimal(18,2)
)
as
–转账,200
–定义一个变量,记录错误数
declare @error_nums int
set @error_nums=0
–开始事务
begin transaction tran_change
begin try
update Customer set Remain=(Remain-@Remain) where id=@idOut
set @error_nums=@error_nums+@@ERROR
update Customer set Remain=(Remain+@Remain) where id=@idIn
set @error_nums=@error_nums+@@ERROR
end try
begin catch
set @error_nums=@error_nums+1
print'错误异常:'+convert(varchar,error_number())+',错误消息'+error_message()
end catch
–回滚
if(@error_nums>0) --表示前面有错误
rollback transaction tran_change --回滚事务
else
commit transaction tran_change --执行事务
exec cp_changeAcount 5,4,500
select * from Customer