SQL 事务话题

所谓事务,就是一个最基本的工作单元,要么整个事务全部操作完成,要么整个事务就不做操作.这一点非常重要,比如说银行系统中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没有执行. 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值