Если select возвращает 0 строк, вставьте данные - PullRequest
1 голос
/ 31 октября 2011

В настоящее время у меня есть транзакция, которая пытается вставить данные в таблицу. Если данные уже находятся в таблице, возникает ошибка сбоя ограничения и выполняется выбор для получения идентификатора.

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;
  }
);

... но это не работает. Эта транзакция выполняет все операции выбора, а затем выполняет вставки. Как я могу заставить работать второй метод?

1 Ответ

0 голосов
/ 31 октября 2011

Я предполагаю, что транзакция ставит запрос в очередь.Таким образом, ваша очередь будет выглядеть следующим образом

Выберите 1

Выберите 2

Выберите 3

Тогда, когда вы фиксируете транзакцию, она выглядит так после первого вызова.

Выбрать 2

Выбрать 3

Вставить 1

Вставить 2

Вставить 3

Это происходитпотому что функции для вызова вставок выполняются после запуска выбора, и это не происходит до тех пор, пока транзакция не завершится, но операции выбора уже зарегистрированы.

Для того, чтобы получить значение

select1

insert1

select2

insert2

Я бы создал отдельную транзакцию для каждого оператора выбора.

...