SQL 事务话题

来源:互联网 发布:三国志哪个好 知乎 编辑:程序博客网 时间:2024/04/30 01:35
所谓事务,就是一个最基本的工作单元,要么整个事务全部操作完成,要么整个事务就不做操作.这一点非常重要,比如说银行系统中A帐户转帐10,000元给B账户的SQL语句,第一条语句update balance set account=account+10000 where ID='B';第二条语句update balance set account=account-10000 where ID='A';这两个语句写成一个存储过程完成转帐工作是初看是没有问题.但是如果第一条语句顺利执行,而第二条语句执行失败(比如设置了Check约束,不允许account<0,而A账户原account<10,000则会造成执行失败),那么我们B账户多了1万元,而A账户账目没有减少,那这条语句就会给银行造成损失.
这只是一个简单例子,如果银行系统中真存在这样的问题,那么无论对用户还是对银行来说都是不愿意看到的.要避免部分语句执行成功,部分语句执行失败的情况发生,就要用到事务.事务跟踪每一个对数据库的更改,如果所有的SQL语句都执行成功了,那么就commit,完成所有的更改,如果有失败的操作,那么就将整个执行过程rollback,使整个事务对数据库不做任何更改.下面就介绍一下事务的相关知识:
1.管理事务中常用的语句有:begin transaction,commit transaction,rollback transaction,save transaction,@@ERROR,@@TRANSCOUNT.
完整的一个事务的基本语句是:
declare @er1 int,@er2 int
begin transaction
--……数据库操作
set @er1=@@ERROR--记录上个操作的错误,如果运行成功,那么其值为0
--
……另一个数据库操作
set @er2=@@ERROR--记录第二个操作的错误
if(@er1=0 and @er2=0)--两个操作都顺利完成则提交事务
 commit transaction
else--有操作失败则回滚事务
 rollback transaction

这是一个简单的事务例句,其他的的事务语句原理相同.
2.事务支持嵌套,嵌套原则和一般的程序嵌套原则相同,commit transaction,rollback transaction针对的是最近的一个未匹配begin transaction.在嵌套的时候最好不要给事务名.另外如果事务A中嵌套了一个事务B,事务B commit,而事务A rollback,那么到底在事务B中执行的修改生效了吗?没有,因为B嵌套在A中,A事务rollback了,所以整个A内的操作全部回滚.总之,只有在最外层事务提交的时候SQL Server才将所有修改写入数据库.
3.Save transaction
这个语句提供一个事务的标记点,让后面的commit或rollback操作标记点后的内容.save transation 和begin transaction 一组,与commit transaction 和rollback transaction进行配对.
比如:
begin transaction
update ......1
save transaction Saved
update ......2
rollback transaction Saved
commit transaction


这个语句运行的结果就是执行了update 1,而update 2没有执行. 

以上只是个人的一点认识和见解,若有错误或不当之处希望大家指正.