事务小例子-钱从哪里来?

      关于事务数据库的时候也学习过,基本的性质也都知道,但是在项目中自己还没有使用过,所以做个小例子,理解一下。

    说到事务,很容易想到就是那个经典的银行转账问题。假如资金从A账户转到B账户,至少需要两步,第一步,账户A的资金减少第二部,账户B的资金增加。现在我们来模拟一下可能出现的问题。

1.新建表,并且插入数据。

     

2.添加约束

根据银行的业务,添加check约束,当前余额要大于1元。

ALTER TABLE bank
   ADD CONSTRAINT CK_currentMoney    
       CHECK(currentMoney>=1)
3.开始转账,钱哪去了?

现在一共是3201元,张三200元,李四1201元,接下来执行转账操作

-- 转账操作,张三的用户减少200元,李四的用户增加200元
UPDATE bank SET currentMoney=currentMoney-200 WHERE customerName='张三'
UPDATE bank SET currentMoney=currentMoney+200WHERE customerName='李四'
同时执行,报错如下:

看数据库中现在的结果是:张三的金额没有减少,但是李四的钱却增加了200元,变成了1401元。

  

错误原因是:张三的账户减少200后,现在余额变成了0元,update语句违反约束:余额>=0元,所以会执行失败,此时报错,张三的金额不会减少。接着执行第二个update语句,第二句执行成功,所以李四增加200元,变成1401元。

面对这样的问题,如何解决呢?这样就产生了对事务的需要。

4.事务解决转账问题

     事务是作为单个逻辑单元执行的一系列的操作,这些操作作为一个整体向系统提交,要么执行,要么都不执行,转账过程就是一个事务。转账需要两条update 语句,这两条语句是一个整体,如果其中一条出现错误,那么整个转账的业务也会取消,两个账户的余额应该恢复到原来的数据,从而确保转账前和转账后的余额不变。

    常用的事务语句:开始事务:begin transaction ;提交事务:commit transaction ;回滚事务:rollback transaction .一旦事务提交或者回滚,那么事务结束。使用全局变量@@ERROR,@@ERROR只能够判断当前的sql语句是否执行有错,为了判断事务中所有的sql语句是否有错,我们需要对错误累计。set @ErrorSum=@ErrorSum+@@error.

执行代码如下:

BEGIN TRANSACTION 
/*--定义变量,用于累计事务执行过程中的错误--*/
DECLARE @errorSum INT 
SET @errorSum=0  -- 初始化为0,即无错误
/*--转账:张三的账户少1000元,李四的账户多1000元*/
UPDATE bank SET currentMoney=currentMoney-200
   WHERE customerName='张三'
SET @errorSum=@errorSum+@@error
UPDATE bank SET currentMoney=currentMoney+200
   WHERE customerName='李四'
SET @errorSum=@errorSum+@@error  -- 累计是否有错误
IF @errorSum<>0  -- 如果有错误
  BEGIN
    print '交易失败,回滚事务'
    ROLLBACK TRANSACTION 
  END  
ELSE
  BEGIN
    print '交易成功,提交事务,写入硬盘,永久的保存'
    COMMIT TRANSACTION   
  END

事务执行失败提示,


数据库中的钱的数目都不会改变。

现在我们让张三给李四转账100元,事务执行成功提示:


现在数据库的数据为:


小结:

  还是得多使用,才能够很好地运用,在实践中成长。







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值