来自Kettle的InnoDB上的SQL语句的错误顺序

时间:2011-05-20 09:27:54

标签: mysql transactions innodb myisam kettle

在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。

3 个答案:

答案 0 :(得分:1)

嗯,在评估了不同的可能性之后,似乎有三种可能性:

  1. 编写我自己的步骤,在事务中执行select / insert
  2. 在其属性中序列化整个转换(使一切都非常慢)
  3. 使用Codeks构思并使用阻止步骤
  4. 我现在选择了第三个选项,因为其他一切目前都不可能。

答案 1 :(得分:1)

只需在插入步骤和下一步之间使用块行步骤。然后,在下一步开始之前,块之前的步骤将完成。

答案 2 :(得分:0)

确保在执行SELECT操作之前提交Update / Insert生成的事务并释放锁。看起来有lock个问题