1

ケトルでは、入力としていくつかの文字列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では失敗し、他のすべてのパラメーターは同じです。行が2番目のステップに挿入されたばかりの場合、最後のステップは失敗しますが、データベースにすでに存在する行に対しては機能します。実際の挿入が行われる前に、接続が最後のステップのSELECTを実行しようとしているように見えます。MySQL設定ではすべてのパラメータがデフォルトに設定されています(MySQL 5.1と5.5は同じ動作を示します)。

だから私の質問は次のとおりです:ケトルやMySQLの関連パラメータは何ですか?これが期待どおりに機能することをどのように保証できますか?MyISAMに戻すことができません。

4

3 に答える 3

1

さまざまな可能性を評価した後、次の 3 つの可能性が考えられます。

  1. トランザクションで選択/挿入を実行する独自のステップを作成する
  2. プロパティで変換全体をシリアル化します(すべてが本当に遅くなります)
  3. Codeks のアイデアを使用し、ブロッキング ステップを使用する

現時点では他のすべてが不可能なため、3 番目のオプションを使用しました。

于 2011-05-27T16:01:19.567 に答える
1

挿入ステップと次のステップの間にブロック行ステップを使用するだけです。次に、ブロックの前のステップが完了してから、次のステップが開始されます。

于 2011-05-31T12:11:24.313 に答える
0

SELECT 操作を実行する前に、Update/Insert によって生成されたトランザクションがコミットされ、ロックが解放されていることを確認してください。ロックに問題があるようです

于 2011-05-20T09:35:11.853 に答える