【问题标题】:Are transactions possible with HTML5 Storage in SafariSafari 中的 HTML5 存储是否可以进行交易
【发布时间】:2011-11-08 06:25:47
【问题描述】:

不是对包含 SQL 语句列表的 JSON 文件执行每个循环并一次传递一个,Safari 客户端存储是否可以简单地将数据包装在“BEGIN TRANSACTION”/“COMMIT TRANSACTION”中并在一次调用中将其传递给数据库系统?循环 1,000 多个语句需要太多时间。

当前一次迭代一个事务:

$j.getJSON("update1.json", 功能(数据){ $j.each(数据,函数(i,项目){ testDB.transaction( 功能(交易){ transaction.executeSql(data[i], [], nullDataHandler, errorHandler); } ); }); });

试图弄清楚如何只打一个电话:

$j.getJSON("update1.json", 功能(数据){ testDB.transaction( 功能(交易){ transaction.executeSql(data, [], nullDataHandler, errorHandler); } ); });

有没有人尝试过并且成功了?

【问题讨论】:

  • 感谢大家的意见!

标签: sql safari html client-side-scripting


【解决方案1】:

我可以在文档中找到的每个示例似乎只显示每个 executeSql 命令的一个 SQL 语句。我只是建议显示一个“ajax spinner”加载图形并在循环中执行您的 SQL。您可以将其全部保留在事务中,但循环仍然需要存在:

$j.getJSON("update1.json",
    function(data){
       testDB.transaction(
           function (transaction) {
               for(var i = 0; i < data.length; i++){
                   transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
               }
           }
       );
    }
);

在事务中移动循环并使用for i = 应该有助于加快循环速度。 $.each 适用于少于 1000 次迭代,之后原生 for(var = i... 可能会更快。

注意 使用我的代码,如果你的任何 SQL 语句抛出错误,整个事务都会失败。如果这不是您的意图,则需要将循环保持在事务之外。

【讨论】:

  • 更正您的笔记。 executeSql 支持为错误提供回调,在您的示例中为 errorHandler。如果此处理程序返回 true,则事务将失败,如果为 false,它将继续(或者可能相反)。
【解决方案2】:

我从来没有弄乱过 HTML5 数据库存储(虽然有本地/会话存储),我认为可以运行一大串语句。使用data.join(separator here) 获取data 数组的字符串表示形式。

【讨论】:

  • 感谢您的回答。即使用“;”分隔,它似乎一次也不会接受一个以上的语句。
  • 这是一个小型数据库,用于简单的操作。如果您想要一个完整的数据库,请将数据发送到服务器。如果你想离线操作,在一个单线程的 javascript 应用程序中,那么内置的 db 工作正常。
【解决方案3】:

是的,可以使用 webSQL 在单个事务中处理整组语句。实际上,您甚至不需要使用 BEGIN 或 COMMIT,只要您从同一事务中进行所有 executeSql 调用,它就会自动为您处理。只要您这样做,每条语句都会包含在事务中。

这使得流程更快,并且当您的一个语句出现错误时,它会回滚整个事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2010-12-30
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多