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

1.Kettle做了一个作业,

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

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

日志报错提示如下:

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

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

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

记住,要勾选Pass all rows

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

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

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

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

1.同时做了两个更新。

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

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

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

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

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

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

总结:

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

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

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

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

上一篇:SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。


下一篇:C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别