Javascript 刷新页面时HTML 5 Web SQL数据库事务提交或回滚
如中所述,回滚HTML 5 Web SQL数据库事务是通过在回调函数中返回true来完成的,该回调函数是作为对事务的错误回调而提供的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
executeSql
方法:
每次查询错误处理回调
这是相当直截了当的。如果
回调返回true,则整个
事务被回滚。如果
回调返回false,则
交易继续进行,好像什么都没有
出了差错。因此,如果你是
在以下情况下执行可选的查询:
该特定查询的失败
不应导致交易失败
如果失败,您应该传入回调
返回false。如果失败
查询应导致整个
若交易失败,则应通过
在返回true的回调中
例如,如果我有以下事务(假设“users”表在“username”字段上有一个唯一的约束,并且username“test”已经存在-我正在尝试再次插入它,这将导致约束错误):
我有两个问题:
谢谢。您是否找到了在事务期间执行AJAX调用的方法?我还没有读完整个规范,但到目前为止,它看起来像是一旦您的
SQLTransactionCallback
或SQLTransactionSyncCallback
返回,您就不能再向事务添加任何内容了,或者您可以吗?也许是从结果回拨
编辑:
现在我再看一次规范(它包含的错误比您链接到的Apple文档少得多,但不那么容易阅读):
SQLTransactionCallback
、SQLStatementCallback
、或sqlstatementererrorcallback
期间未调用方法[executeSql
],则引发无效状态错误
异常SQLStatementCallback
需要一些时间,您就可以一次又一次地忙着等待执行select 3+4
,每次都是从上一个select 3+4
的语句回调开始的,直到AJAX调用在某个地方设置了一个包含所需数据的标志为止。这是一个糟糕的编程(它会毫无理由地消耗大量CPU,可能会阻止低优先级任务,如重新显示页面),但我认为这可能是让事务在任意时间段内保持打开状态的唯一方法。可惜你不能在SQLite中选择3+4,sleep(1)
通常,SQLite(这里的底层存储引擎)回滚未完成的事务。我还没有测试你要问的页面重新加载错误案例。如果是这样的话,我会非常惊讶
顺便说一下,非常感谢你发布这个问题。我一直在试图找出如何让事务回滚,即使是在原始规范中
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
}