正如在Safari Client-Side Storage and Offline Applications Programming Guide中所写,回滚HTML 5 Web SQL数据库事务是通过在回调函数中返回true来完成的,该函数作为错误回调提供给一个事务 {{1方法:
每个查询错误处理回调 相当简单。如果 回调返回true,整个 交易回滚。如果 回调返回false, 交易继续,好像一无所获 出了问题。因此,如果你是 执行可选的查询 - 如果 该特定查询失败 不应该导致交易 失败 - 你应该传递一个回调 返回false。如果失败了 查询应该导致整个 交易失败,你应该通过 在回调中返回true。
例如,如果我有以下事务(假设'users'表在'username'字段上有一个UNIQUE约束,并且用户'test'已经存在 - 我试图再次插入,这应该导致约束错误):
executeSql
我有两个问题:
如果我必须在事务中包含许多操作(例如,我必须使用ajax将一些数据发送到服务器并等待响应等),并且用户在响应到达之前重新加载页面(这意味着不会调用errorCallback),是提交事务还是失败?
有谁知道如何手动回滚Web SQL事务?例如,如果我想根据ajax调用的结果回滚事务,怎么办呢?我应该运行包含错误的查询以确保调用错误回调吗?
感谢。
答案 0 :(得分:2)
abort
方法。关于AJAX,在开始写入事务之前,请准备好所有数据。你描述的不会有任何问题。尽可能使用数据库约束(UNIQUE,FOREIGNKEY)。
答案 1 :(得分:1)
您是否找到了在交易期间进行AJAX调用的方法?我还没有读完整个规范,但到目前为止看起来只要你的SQLTransactionCallback
或SQLTransactionSyncCallback
返回,就不能再为交易添加任何东西 - 或者你可以吗?也许来自结果回调?
编辑: 现在我再看一下,规范(包含的错误比你链接到的Apple文档少得多,但不容易阅读)says this:
- 如果在执行
executeSql
,SQLTransactionCallback
或SQLStatementCallback
期间未调用方法[SQLStatementErrorCallback
],则会引发INVALID_STATE_ERR
例外。< / LI> 醇>
所以我认为这意味着没有办法做到这一点。
进一步编辑:不,等等!只要SQLStatementCallback
需要一些时间来调用,您就可以忙着 - 一次又一次地执行select 3 + 4
,每次都来自前一个{select 3 + 4
的语句回调1}},直到你的AJAX调用在某个地方设置一个包含你想要的数据的标志。这是一个糟糕的编程(它没有充分的理由会占用大量的CPU,可能会阻止重新显示页面等优先级较低的任务),但我认为这可能是在任意时间段内保持事务处于打开状态的唯一方法。太糟糕了,你不能在SQLite中select 3 + 4, sleep(1)
。
通常,SQLite(此处的底层存储引擎)回滚未完成的事务。我还没有测试过你要问的页面重载错误案例。如果它被提交,我会感到非常惊讶。
顺便说一下,非常感谢您发布这个问题。我一直试图找出如何让事务回滚,即使原始规范中有it is meticulously documented。