背景
上篇文章我们介绍了MySQL支持的compound statement SQL的语法。有同学指出这个只是“部分compound”,因为这种多语句语法中不支持if这样的逻辑操作,因此在业务中的使用会受限。
这里我们给出一个常见的事务的逻辑。
1) 更新一行
2)若更新成功一行,则在另外一个表中插入一行,否则事务回滚。
在这样的需求下,就是由于少了逻辑判断,导致无法用compound statement发整个事务,因此需要多次交互。
新增HINT
在这类需求中我们发现,其实我们要的只是一个判断更新是否成功的判断。
因此设计这样的HINT及逻辑:
在UPDATE和DELETE语句中增加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