1

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

4

3 回答 3

1

好吧,在评估了不同的可能性之后,三个似乎是可能的:

  1. 编写我自己的步骤,在事务中执行选择/插入
  2. 在其属性中序列化整个转换(使一切变得非常缓慢)
  3. 使用 Codeks 想法并使用阻塞步骤

我现在选择了第三种选择,因为目前其他一切都是不可能的。

于 2011-05-27T16:01:19.567 回答
1

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

于 2011-05-31T12:11:24.313 回答
0

确保在执行 SELECT 操作之前提交由更新/插入生成的事务并释放锁。好像有问题

于 2011-05-20T09:35:11.853 回答