Kettle 解决数据锁的问题(事务(进程 ID 51)与另一个进程被死锁在 锁 资源上)

1.Kettle做了一个作业,

执行的时候问题发生在步骤2和步骤3之间,也就是步骤2还未完全执行完的时候,步骤3就要更新步骤2插入的数据,造成死锁。(我的理解是既然都分开作业了,那么每个作业都是一个单独的事务,只有上个事务执行完毕后才会执行下个步骤,为什么会抢资源呢?另外看网上描述,说Kettle社区版只支持单表事务,不知道和这里是否有联系。)

日志报错提示如下:

事务(进程 ID 51)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

 

解决办法就是在步骤2的作业最后环节加入一个阻塞,使步骤2完成之后再继续步骤三。

记住,要勾选Pass all rows

 

第二天发现日志还是出现一样的情况。后面重新翻开作业看下

发现问题的症结出现在这个作业里面,打开这个作业对应的转换。原来问题在这里,

1.同时做了两个更新。

2.两个更新针对是同一个表。

3.转换内是并发执行的。

至此问题已明白,同一时间更新同一表肯定会造成线程占用的情况!

解决办法就是把作业和转换分拆成两个,问题解决。

总结:

1.转换中同一个表多个更新不要写在一起,要分开多个作业。

2.作业和转换的名称命名最好按照顺序来,后面出错后在日志排查的地方可以提供有力的分析。前面这块没做好,没有通过日志直接发现问题出处。

上面显示先4、后3,其实是作业4调用了转换3。结果我一直去作业3那里分析了很久。切记切记!

 

posted on 2018-11-21 11:41  Neo0820  阅读(7773)  评论(0编辑  收藏  举报

导航