刷新页面时HTML 5 Web SQL数据库事务提交或回滚

Szi*_*rdD 7 javascript database html5 transactions web-sql

至于写在Safari浏览器客户端存储和离线应用程序编程指南,回滚HTML 5的Web SQL数据库事务通过返回的错误回调提供的回调函数做真实交易executeSql方法:

每个查询错误处理回调非常简单.如果回调返回true,则回滚整个事务.如果回调返回false,则事务继续,就好像什么都没有出错一样.因此,如果您正在执行可选的查询 - 如果该特定查询的失败不应导致事务失败 - 您应该传入一个返回false的回调.如果查询失败导致整个事务失败,则应传入一个返回true的回调.

例如,如果我有以下事务(假设'users'表在'username'字段上有一个UNIQUE约束,并且用户'test'已经存在 - 我试图再次插入,这会导致约束错误) :

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

function errorCallback() {
    return true; //this causes the rollback
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如果我必须在事务中包含许多操作(例如,我必须使用ajax将一些数据发送到服务器并等待响应等),并且用户在响应到达之前重新加载页面(这意味着errorCallback将不会被调用),交易会被提交还是会失败?

  2. 有谁知道如何手动回滚Web SQL事务?例如,如果我想根据ajax调用的结果回滚事务,怎么办呢?我应该运行包含错误的查询以确保调用错误回调吗?

谢谢.

Kya*_*Tun 2

  1. 交易将被提交。
  2. 是的,要显式回滚,您必须显式调用无效查询。这是推荐的解决方法,因为快速而肮脏的 API 缺少abort方法。

对于 AJAX,在开始写入事务之前准备好所有数据。正如你所描述的,你不会有任何问题。尽可能使用数据库约束(UNIQUE、FOREIGNKEY)。