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

Javascript 刷新页面时HTML 5 Web SQL数据库事务提交或回滚,javascript,database,html,transactions,web-sql,Javascript,Database,Html,Transactions,Web Sql,如中所述,回滚HTML 5 Web SQL数据库事务是通过在回调函数中返回true来完成的,该回调函数是作为对事务的错误回调而提供的executeSql方法: 每次查询错误处理回调 这是相当直截了当的。如果 回调返回true,则整个 事务被回滚。如果 回调返回false,则 交易继续进行,好像什么都没有 出了差错。因此,如果你是 在以下情况下执行可选的查询: 该特定查询的失败 不应导致交易失败 如果失败,您应该传入回调 返回false。如果失败 查询应导致整个 若交易失败,则应通过 在返回tru

如中所述,回滚HTML 5 Web SQL数据库事务是通过在回调函数中返回true来完成的,该回调函数是作为对事务的错误回调而提供的
executeSql
方法:

每次查询错误处理回调 这是相当直截了当的。如果 回调返回true,则整个 事务被回滚。如果 回调返回false,则 交易继续进行,好像什么都没有 出了差错。因此,如果你是 在以下情况下执行可选的查询: 该特定查询的失败 不应导致交易失败 如果失败,您应该传入回调 返回false。如果失败 查询应导致整个 若交易失败,则应通过 在返回true的回调中

例如,如果我有以下事务(假设“users”表在“username”字段上有一个唯一的约束,并且username“test”已经存在-我正在尝试再次插入它,这将导致约束错误):

我有两个问题:

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

  • 有人知道如何手动回滚Web SQL事务吗?例如,如果我想根据ajax调用的结果回滚事务,该如何实现?我是否应该运行包含错误的查询以确保调用了错误回调


  • 谢谢。

    您是否找到了在事务期间执行AJAX调用的方法?我还没有读完整个规范,但到目前为止,它看起来像是一旦您的
    SQLTransactionCallback
    SQLTransactionSyncCallback
    返回,您就不能再向事务添加任何内容了,或者您可以吗?也许是从结果回拨

    编辑: 现在我再看一次规范(它包含的错误比您链接到的Apple文档少得多,但不那么容易阅读):

  • 如果在执行
    SQLTransactionCallback
    SQLStatementCallback
    、或
    sqlstatementererrorcallback
    期间未调用方法[
    executeSql
    ],则引发
    无效状态错误
    异常
  • 所以我认为这意味着没有办法做到这一点

    进一步编辑:不,等等!只要调用
    SQLStatementCallback
    需要一些时间,您就可以一次又一次地忙着等待执行
    select 3+4
    ,每次都是从上一个
    select 3+4
    的语句回调开始的,直到AJAX调用在某个地方设置了一个包含所需数据的标志为止。这是一个糟糕的编程(它会毫无理由地消耗大量CPU,可能会阻止低优先级任务,如重新显示页面),但我认为这可能是让事务在任意时间段内保持打开状态的唯一方法。可惜你不能
    在SQLite中选择3+4,sleep(1)

    通常,SQLite(这里的底层存储引擎)回滚未完成的事务。我还没有测试你要问的页面重新加载错误案例。如果是这样的话,我会非常惊讶

    顺便说一下,非常感谢你发布这个问题。我一直在试图找出如何让事务回滚,即使是在原始规范中

  • 事务将被提交
  • 是的,要显式回滚,必须显式调用无效查询。这是推荐的解决方法,因为快速脏API缺少
    abort
    方法

  • 关于AJAX,在开始写事务之前,请准备好所有数据。你不会有你描述的任何问题。尽可能使用数据库约束(唯一,FOREIGNKEY)

    我尝试在AJAX调用之前将事务对象保存到变量中,在它返回后,使用它执行另一个查询。但是我得到一个DOM异常,声明事务对象不能再使用了。这只发生在AJAX调用之后,使用同步函数/回调,我可以将其作为参数传递,并在单个事务中运行多个查询。我没有尝试过同步调用AJAX(例如使用jQuery),这可能会使事务对象保持在有效状态。我认为jQuery不支持同步AJAX;它会冻结页面和(在Chrome之外)整个浏览器,直到完成。这就是在事务期间执行AJAX或任何超时调用的方式:
    database.transaction(function(transaction) {
        transaction.executeSql(
            "INSERT INTO users (username) VALUES('test')",
            null,
            dataCallback,
            errorCallback
         );
    });
    
    function errorCallback() {
        return true; //this causes the rollback
    }