HTML 5 Web SQL Database Транзакция фиксации или отката при обновлении страницы - PullRequest
7 голосов
/ 28 февраля 2011

Как написано в Руководстве по программированию клиентских хранилищ и автономных приложений Safari , откат транзакции базы данных HTML 5 Web SQL выполняется путем возврата значения true в функцию обратного вызова, предоставленную как обратный вызов ошибки, в транзакция метод executeSql:

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

Например, если у меня есть следующая транзакция (предположим, что таблица 'users' имеет ограничение UNIQUE на поле 'username', а username 'test' уже существует - который я пытаюсь вставить снова, что должно привести к ошибка ограничения):

database.transaction(function(transaction) {
    transaction.executeSql(
        "INSERT INTO users (username) VALUES('test')",
        null,
        dataCallback,
        errorCallback
     );
});

function errorCallback() {
    return true; //this causes the rollback
}

У меня два вопроса:

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

  2. Кто-нибудь знает, как откатить транзакцию Web SQL вручную? Например, если я хочу откатить транзакцию на основе результата вызова ajax, как это можно сделать? Должен ли я выполнить запрос, который содержит ошибку, чтобы убедиться, что обратный вызов ошибки вызван?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2013
  1. Транзакция будет совершена.
  2. Да, для отката в явном виде необходимо явно вызвать недействительный запрос.Это рекомендуемый обходной путь, поскольку в быстром и грязном API отсутствует метод abort.

Что касается AJAX, будьте готовы все данные, прежде чем начинать транзакцию записи.У вас не будет никаких проблем, как вы описали.Используйте ограничение базы данных (UNIQUE, FOREIGNKEY), насколько это возможно.

1 голос
/ 17 марта 2011

Нашли ли вы способ совершать AJAX-звонки во время транзакции?Я еще не закончил читать всю спецификацию, но до сих пор похоже, что как только ваш SQLTransactionCallback или SQLTransactionSyncCallback вернется, вы не сможете добавить больше материала к транзакции - или нет?Может быть из обратного вызова результатов?

Редактировать: Теперь, когда я снова посмотрю, спецификация (которая содержит намного меньше ошибок, чем документ Apple, с которым вы связаны, но не так легко читается) говорит это :

  1. Если метод [executeSql] не был вызван во время выполнения SQLTransactionCallback, SQLStatementCallback или SQLStatementErrorCallback, то вызвать исключение INVALID_STATE_ERR.

Так что я думаю, что это означает, что нет никакого способа сделать это.

Дальнейшее редактирование: Нет, подождите!Пока SQLStatementCallback требуется некоторое время для вызова, вы можете быть заняты - ждать, делая select 3 + 4 снова и снова, каждый раз от обратного вызова оператора предыдущего select 3 + 4, до вашего AJAXВызов устанавливает флаг где-то, что имеет данные, которые вы хотите.Это ужасное программирование (оно потребляет много ресурсов ЦП без веской причины, может блокировать задачи с более низким приоритетом, такие как повторное отображение страницы), но я думаю, что это, вероятно, единственный способ сохранить транзакцию открытой в течение произвольного периода времени.Жаль, что вы не можете select 3 + 4, sleep(1) в SQLite.

В общем, SQLite (базовый механизм хранения здесь) откатывает незавершенные транзакции.Я еще не проверял случай ошибки при перезагрузке страницы, о котором вы спрашиваете.Я был бы очень удивлен, если бы оно было совершено.

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

...