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

你可能感兴趣的:(mysql,性能)