Как написано в Руководстве по программированию клиентских хранилищ и автономных приложений Safari ,откат транзакции базы данных HTML 5 Web SQL выполняется путем возврата true в функции обратного вызова, предоставленной как обратный вызов ошибки для транзакции метода executeSql
:
Ошибка для каждого запроса -обработка обратного вызова довольно просто. Если обратный вызов возвращает истину, весь транзакция откатывается. Если обратный вызов возвращает false, транзакция продолжается как ни в чем не бывало пошло не так. Таким образом, если вы выполнение необязательного запроса - если сбой этого конкретного запроса не должен приводить к транзакции сбой - вы должны передать обратный вызов что возвращает false. Если отказ запрос должен вызвать весь транзакция не удалась, вы должны пройти в обратном вызове, который возвращает истину.
Например, если у меня есть следующая транзакция (предположим, что в таблице 'users' есть ограничение UNIQUE в поле '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
}
У меня два вопроса:
Если мне нужно включить много операций в транзакцию (например, мне нужно отправить некоторые данные с помощью ajax на сервер и дождаться ответ и т. д.), и пользователь перезагружает страницу до того, как пришел ответ (что означает, что errorCallback не будет вызван), будет ли транзакция завершена или завершится неудачей?
Кто-нибудь знает, как откатить Интернет SQL-транзакция вручную? Например, если я хочу откатить транзакцию на основе результата вызова ajax, как это можно сделать? Следует ли мне выполнить запрос, содержащий ошибку, чтобы убедиться, что вызывается обратный вызов ошибки?
Спасибо.