2011-10-31 8 views
1

現在、テーブルにデータを挿入しようとするトランザクションがあります。データが既にテーブルにある場合、制約エラーが発生し、selectを実行してIDを取得します。selectが0行を返した場合データを挿入する

t2.executeSql('INSERT INTO books (book) VALUES (?);', 
    [record], 
    function (t2, r) {  // SQL_successfulCallback 
    record = r.insertId; 
    }, 
    function (t2, err) {  // SQL_errorCallback 
    if (err.message !== 'constraint failed') { // insert failed because of other 
               // reason - fail transaction 
     console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.'); 
     return true; 
    } else { // insert failed because data was already in the table 
     t2.executeSql('SELECT bookID FROM books WHERE book=?', 
     [record], 
     function (t, r) { // SQL_successfulCallback 
      record = r.rows.item(0).classificationID; 
     }, 
     function (t, err) { // SQL_errorCallback 
      console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.'); 
      return true; 
     } 
    ); 
     return false; 
    } 
    } 
); 

トランザクションを高速化して、データが最初にテーブルにあるかどうかを確認したいと考えました。それ以外の場合は挿入してください。

t2.executeSql('SELECT bookID FROM books WHERE book=?', 
    [record], 
    function (t2, r) {   // SQL_successfulCallback 
    if (r.rows.length !== 0) { 
     record = r.rows.item(0).bookID; 
    } else { 
     t2.executeSql('INSERT INTO books (book) VALUES (?);', 
     [record], 
     function(t2, r){  // SQL_successfulCallbac 
      record = r.insertId; 
     }, 
     function (t2, err) { // SQL_errorCallback 
      if (err.message !== 'constraint failed') { // insert failed because of other 
                // reason - fail transaction 
      console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.'); 
      return true; 
      } else { // insert failed because data was already in the table 
      return false; 
      } 
     } 
    ); 
    } 
    }, 
    function (t, err) {   // SQL_errorCallback 
    console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.'); 
    return true; 
    } 
); 

...しかし動作しません。このトランザクションはすべての選択を実行し、次に挿入を行います。 2番目の方法はどのように動作させることができますか?

答えて

0

私はトランザクションがリクエストをキューに入れていると仮定しています。だからあなたのキューを選択1

このよう

になります選択2

セレクト3

あなたのトランザクションをコミットするときに、最初の呼び出しの後、次のようになります。

セレクト2

セレクト3

挿入1

挿入2

挿入3

挿入を呼び出すための機能を選択した後exectedされているので、これが起こっていますトランザクションがコミットされ、選択が既に登録されるまで、これは起こらない。

私は、各select文に対して個別のトランザクションを作成し、それは

insert2

SELECT1

insert1

SELECT2

であることを得るために。

+0

**方法2をしないでください!**方法1は28,439レコードで22秒かかります。方法2は、Michaelが提案したトランザクションラッパーを使用して、同じ数のレコードに対して_34秒を要します。 – DataZombies

+0

レコードを一度に挿入する方法と、データをどのように入力するのか。私は、ユーザーが一度にいくつかのレコードを入力していたと仮定していたのですが、これは一度に28,439レコードを挿入しているのでしょうか? –

+0

データはJSONファイルから取得されています。挿入する代わりに、テーブルの一意の値を保持するためにメモリ内に配列を作成し、その小さな配列を使用して挿入を行います。 – DataZombies