TARGET_AFFECT_ROWS 与 compound-statement 减少SQL交互的方案

背景

       上篇文章我们介绍了MySQL支持的compound statement SQL的语法。有同学指出这个只是“部分compound”,因为这种多语句语法中不支持if这样的逻辑操作,因此在业务中的使用会受限。

 

       这里我们给出一个常见的事务的逻辑。

    1) 更新一行

   2)若更新成功一行,则在另外一个表中插入一行,否则事务回滚。

  在这样的需求下,就是由于少了逻辑判断,导致无法用compound statement发整个事务,因此需要多次交互。

 

新增HINT

       在这类需求中我们发现,其实我们要的只是一个判断更新是否成功的判断。

因此设计这样的HINT及逻辑:

       UPDATEDELETE语句中增加HINT /*TARGET_AFFECT_ROWS n*/表示这个语句要求修改n行,若不满足这个条件,则认为事务需要回滚。

 

 

使用

       有了这个功能,在实现上诉的业务逻辑时,我们就能直接将以下语句发给Server:

       delimiter ;;

   begin; update /*TARGET_AFFECT_ROWS 1*/ t1  set b=b+1 where a=1 and b>=0; insert into ….; commit;;

      

       这样t1表中a=1这行的b<0, 整个事务无效.

 

小结

       其好处就是

       1\ 在正常执行时,只需要一次交互

       2\ 在需要回滚时,无需再发一个rollback命令。

 

     另外,特别说明,整个方案idea绝大部分来自于 @dbatools

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值