在Kettle中,我在转换中使用以下逻辑,给出一些字符串X和Y作为输入:
[User Defined Java Expression] Generate ID
[Insert / Update] Update/Insert table set id = generatedId, name=X, company=Y where name = X; don't update the ID column
[Database Value Lookup]select id from table where name = X
想法是更新表中的现有条目或创建新条目,并在下一步(可能是现有条目或新生成的条目)中获取有趣行的ID。
这在MySQL + MyISAM上执行时工作正常但在MySQL + InnoDB上失败,所有其他参数都相同。在第二步中插入行时,最后一步失败,但适用于数据库中已存在的行。似乎连接尝试在实际插入发生之前执行最后一步的SELECT。 在MySQL设置中将所有参数设置为默认值(MySQL 5.1和5.5显示相同的行为)。
所以我的问题是:Kettle和/或MySQL中的相关参数是什么?我怎样才能保证这是按预期工作的?我无法切换回MyISAM。
答案 0 :(得分:1)
嗯,在评估了不同的可能性之后,似乎有三种可能性:
我现在选择了第三个选项,因为其他一切目前都不可能。
答案 1 :(得分:1)
只需在插入步骤和下一步之间使用块行步骤。然后,在下一步开始之前,块之前的步骤将完成。
答案 2 :(得分:0)
确保在执行SELECT操作之前提交Update / Insert生成的事务并释放锁。看起来有lock个问题