1)事务是什么(tran)
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性。
2)事务ACID的特性
1)原子性(不可分割性):一个事务(transaction)中的所有操作,要么全部执行,要么全部不执行,而不会中断在某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2)一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
3)隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
4)持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3)事务的操作
1)begin transaction:开始事务。
2) commit transaction:提交事务。
3) rollback transaction:回滚事务。
4) save transaction:事务保存点。即事务回滚时,可以指定回滚到保存点,而不进行全部回滚。
4)实例
首先我们创建一张客户表(Customers),如下图所示:
注意:
@@error:当前一个语句遇到错误时,返回错误号,否则返回0。需要注意的是@@error在每一条语句执行后会被立刻重置
error_number():指的是从 –20,000 到 –20,999 之间的参数
error_message():指的是 相应的提示信息(< 2048 字节)
实现效果:张三给李四转账 200,为此 张三的金额(Remain)-200,李四的金额(Remain)+200
代码如下:
begin tran tran_charge --开始事务
declare @err_nums int --定义变量记录错误数 设置默认为0
set @err_nums=0
begin try
update Customers set Remain=Remain-200 where ID=1
set @err_nums=@err_nums+@@error
--测试出错代码,看看张三的金额减少,李四的金额是否会增加
update Customers set Remain=Remain+200 where ID=2
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 tran tran_charge --回滚事务
else
commit tran tran_charge --提交事务
最终结果如下:
以上就是关于事务的介绍与实例,一般事务都会用到存储过程当中