Неправильный порядок операторов SQL в InnoDB от 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

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

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

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


person Dominik Sandjaja    schedule 20.05.2011    source источник
comment
Кажется, я столкнулся с forums.pentaho.com/archive/index.php /t-52666.html — на шаге вставки/обновления транзакции отсутствуют.   -  person Dominik Sandjaja    schedule 20.05.2011


Ответы (3)


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

person Codek    schedule 31.05.2011

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

  1. Напишите свой собственный шаг, который выполняет выбор/вставку в транзакции
  2. Сериализуйте все преобразование в его свойствах (делает все ДЕЙСТВИТЕЛЬНО медленным)
  3. Используйте идею Codeks и используйте шаг блокировки

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

person Dominik Sandjaja    schedule 27.05.2011

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

person Tudor Constantin    schedule 20.05.2011
comment
Спасибо, но это именно то, что нужно: как я могу заставить шаг Insert/Update заблокировать таблицу, пока она не будет завершена? Как я могу достичь этой целостности с помощью Kettle? - person Dominik Sandjaja; 20.05.2011
comment
просто используйте шаг блочных строк между шагом вставки и следующим шагом. Затем шаг перед блоком будет завершен до начала следующего шага. - person Codek; 20.05.2011
comment
Codek, у меня есть только шаг блокировки или блокировка этого шага до тех пор, пока шаги не закончатся, но они ждут, пока ВСЕ строки не будут обработаны на заблокированном шаге. Это невозможно для количества строк, которые у меня есть. Простой шаг Block Rows недоступен в моем чайнике / ложке 4.1. - person Dominik Sandjaja; 23.05.2011
comment
@Codek: Поскольку я выбрал ваш вариант, не могли бы вы указать его в реальном ответе, чтобы я мог его принять? - person Dominik Sandjaja; 27.05.2011