通过简单暴力之升级版,我们即扩大了并发性能,同时又控制住了同一目标表的触发任务的执行顺序,看似美好了,但是其实还有其他的不足

我们看看另外一种业务场景

设置触发1  源表A  触发新建 B

设置触发2  源表A 触发新建  C

设置触发3  源表A 触发新建  D

期望  首先执行触发1

       然后执行触发2   

      最后执行触发3

这样的场景下  我们再来看看之前的模型

按照之前的逻辑,任务顺序分析后,不同的目标表的任务分别放入对应的队列中去,最终形成的队列如下图

此时,T1 、T2、  T3之间的执行顺序实际是随机的

也就是抽象一点说,我们控制住了纵向的顺序,还没有控制住横向的顺序

那如何控制中横向的顺序呢?

我们先看看下图

上图中  队列中不仅需要执行的T1 T2 T3 ,还有我们的阻塞任务,并且被其他列表中的任务所指,如果阻塞任务不被执行,那么指向他的任务也不能执行

我们来具体分析下执行过程

如上图

首先只有T1能够被取出来,而当T1被取出来后,

同理,只有A表中的阻塞任务能够取出行,而当A表中的阻塞取出来后

同理,只有T2能够被取出,一次类推

最终实现了  T1 -> T2 -> T3 这样的横向顺序的控制

那么上述这种横向阻塞模型逻辑上是怎么实现的的?我们接着看看

如上图,

首先,我们对待分析顺序队列中的所有任务,做一次遍历,

如果当前任务和前一个任务目标表不一样,

那么就在两个任务之间,产生一个阻塞任务,

并且该阻塞任务的目标表ID 等于 上一个任务的目标表ID

并且当前任务指向该阻塞任务

最终遍历执行,所有任务的顺序如下图

然后我们将这些任务,按照目标表进行分组,分别放入到对应的队列中去

最终就形成了我们的横向顺序控制模型

创建人:yinyanting

快速跳转