事务索引触发器

事务

为什么需要事务

分析银行转账流程:资金从账户A转到账户B,至少需要两步

  1. 账户A的资金减少

  2. 账户B的资金对应增加

问题是:有可能转账资金不足或者资金冻结等一系列问题

UPDATE [User] SET CurrentMoney-=100 WHERE ID=11004
UPDATE [User] SET CurrentMoney+=100 WHERE ID=11005

分析问题:

  1. 11004号账户转出资金失败-UPDATE语句违反检查约束

  2. 但是11005号账户转入资金成功

  3. 结果导致银行亏钱

什么是事务

事务的概念及要求

  1. 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作

  2. 多个操作作为一个整体向系统提交,要么全部执行,要么都不执行

  3. 事务是一个不可分割的工作逻辑单元

银行转账过程就是一个事务

  1. 它需要两条UPDATE语句来完成,这两条SQL语句是一个整体

  2. 如果其中任意一条出现异常,则整个转账业务也应该取消,两个账户中的余额应该恢复到原来的数据,从而确保转账前和转账后的余额不变

事务的特性

ACID

  1. 原子性(Atomicity):事务是一个完整的操作,事务的各个步骤的操作都是不可分的,要么都执行,要么都不执行

  2. 一致性(Consistency):当事务完成时,数据必须处于一致状态

  3. 隔离性(Isolation):并发事务之间彼此隔离,独立。它不应该以任何方式依赖于或影响到其他事务

  4. 永久性(Durability):事务完成后,它对数据库的修改被永久保存

事务的分类

显示事务

  1. 用BEGIN TRANSACTION明确指定事务的开始

  2. 最常用的事务类型

隐式事务

  1. 通常会设置SET IMPLICIT_TRANSACTIONS ON语句将隐式事务模式设置为打开

  2. 其后的T-SQL语句会自动启动一个新事务

  3. 提交或回滚一个事务后,下一个T-SQL语句又将启动 一个新事务

自动提交事务

  1. SQL Server的默认模式

  2. 每条单独的T-SQL语句可理解为一个事务

创建事务

--银行转账业务
DECLARE @ZHA INT=11004,@ZHB INT=11005,@Money INT=10,@errorSum INT=0
BEGIN TRANSACTION
 BEGIN
  UPDATE [User] SET CurrentMoney-=@Money WHERE ID=@ZHA
  SET @errorSum+=@@ERROR  --对错误进行累计
  UPDATE [User] SET CurrentMoney+=@Money WHERE ID=@ZHB
  SET @errorSum+=@@ERROR
  IF(@errorSum>0)
    BEGIN
     PRINT '转账失败!'
     ROLLBACK TRANSACTION ---事务回滚
    END
  ELSE
    BEGIN
     PRINT '转账成功!'
     COMMIT TRANSACTION ----事务提交
    END
 END
  1. 开始事务

    BEGIN TRAN[SACTION]

     

  2. 提交事务

    COMMIT TRANSACTION

     

  3. 回滚事务(撤销事务)

    ROLLBACK TRANSACTION

     

一旦事务被提交或者被回滚,则该事务都结束

事务处理中的关键问题

对事务中的INSERT、UPDATE、DELETE语句实时跟踪

判断某条语句执行是否出错的方法

  1. 使用全局变量@@ERROR

  2. @@ERROR只判断当前一条T-SQL语句执行是否有错

  3. 为了判断事务中所有T-SQL语句是否有错,可以对错误进行累计

事务的使用

CREATE PROC sp_BankZhuanZhang
@ZHA INT,
@ZHB INT,
@Money INT
AS
DECLARE @errorSum INT=0
 BEGIN TRAN
  BEGIN
     UPDATE [User] SET CurrentMoney-=@Money WHERE ID=@ZHA
  SET @errorSum+=@@ERROR
  UPDATE [User] SET CurrentMoney+=@Money WHERE ID=@ZHB
  SET @errorSum+=@@ERROR
  IF(@errorSum>0)
    BEGIN
     PRINT '转账失败!'
     ROLLBACK TRANSACTION ---事务回滚
    END
  ELSE
    BEGIN
     PRINT '转账成功!'
     COMMIT TRANSACTION ----事务提交
    END
 END

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值