通过简单暴力之升级版,我们即扩大了并发性能,同时又控制住了同一目标表的触发任务的执行顺序,看似美好了,但是其实还有其他的不足
我们看看另外一种业务场景
例
设置触发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