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