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那里分析了很久。切记切记!