Неправильный порядок операторов SQL на InnoDB из Kettle - PullRequest
1 голос
/ 20 мая 2011

В 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

Идея состоит в том, чтобы обновить существующие записи в таблице или создать новые и получить идентификаторинтересной строки на следующем шаге (который может быть существующим или только что сгенерированным).

Это прекрасно работает при выполнении на MySQL + MyISAM, но не на MySQL + InnoDB, при этом все остальные параметры идентичны,Последний шаг завершается неудачно, когда строка просто вставляется на втором шаге, но работает для строк, уже существующих в базе данных.Кажется, что соединение пытается выполнить SELECT последнего шага до того, как произошла фактическая вставка.Все параметры установлены по умолчанию в настройках MySQL (MySQL 5.1 и 5.5 показывают одинаковое поведение).

Итак, мои вопросы: Каковы соответствующие параметры в Kettle и / или MySQL?Как я могу гарантировать, что это работает как положено?Я не могу вернуться к MyISAM.

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Что ж, после оценки разных возможностей, возможны три:

  1. Напишите мой собственный шаг, который выполняет выбор / вставку в транзакции
  2. Сериализация всего преобразования в его свойствах (делает все очень медленно)
  3. Используйте идею Кодекса и используйте шаг блокировки

На данный момент я выбрал третий вариант, поскольку все остальное на данный момент невозможно.

1 голос
/ 31 мая 2011

просто используйте шаг строк блока между шагом вставки и следующим шагом.Затем шаг до блока завершится, прежде чем начнется следующий шаг.

0 голосов
/ 20 мая 2011

Убедитесь, что транзакция, сгенерированная Update / Insert, зафиксирована и блокировки сняты перед выполнением операции SELECT. Похоже, есть блокировка проблемы

...