【问题标题】:Cordova SQLite transaction not rolling backCordova SQLite 事务不回滚
【发布时间】:2014-04-12 20:05:57
【问题描述】:

我有以下代码用于混合移动应用程序中使用的数据库(由变量 db 表示)。

SQLite 数据库中没有Customers 或Items 表,所以第三条和第四条SQL 语句会抛出错误,但表Table1Backup 仍然创建完成。 为什么会发生这种情况,因为在这种情况下应该在事务中发生隐式回滚?

db.transaction(function(tx) {
    tx.executeSql("DROP TABLE if exists Table1Backup", [], success, error);
    tx.executeSql("CREATE TABLE if not exists Table1Backup AS 
                                 SELECT * FROM Table1", [], success, error);
    tx.executeSql("CREATE TABLE CustomersBackup AS SELECT * FROM Customers",
                                                    [], success, error);
    tx.executeSql("CREATE TABLE ItemsBackup AS SELECT * FROM Items",
                                                    [], success, error);
   });
}
function success(tx, result) {
      alert("succeeded ");
}
function error(tx, err) {
     alert("ERROR  " + err.message);
}

【问题讨论】:

    标签: sqlite cordova hybrid-mobile-app


    【解决方案1】:

    我找到了答案。为了使事务在错误时回滚,在基于 CORDOVA 的混合应用程序中使用 SQLITE 时,必须遵循以下任一选项

    1. 如果你确实提供了错误回调,那么确保它返回一个 true。 如果错误回调返回一个 false,那么事务将不会回滚并且之前的语句将自动提交。

      db.transaction(function(tx) {
      tx.executeSql("DROP TABLE if exists Table1Backup", [], success, error);
      tx.executeSql("CREATE TABLE if not exists Table1Backup AS 
                               SELECT * FROM Table1", [], success, error);
      tx.executeSql("CREATE TABLE CustomersBackup AS SELECT * FROM Customers",
                                                  [], success, error);
      tx.executeSql("CREATE TABLE ItemsBackup AS SELECT * FROM Items",
                                                  [], success, error);
       });
      }
      function success(tx, result) {
          alert("succeeded ");
      }
      function error(tx, err) {
          alert("ERROR  " + err.message);
          return true;//THIS IS IMPORTANT FOR TRANSACTION TO ROLLBACK ON QUERY ERROR
      }
      
    2. 不提供错误回调,如下面的代码所示。如果您遵循此选项,您仍然可以提供成功回调。

      db.transaction(function(tx) {
        tx.executeSql("DROP TABLE if exists Table1Backup");
        tx.executeSql("CREATE TABLE if not exists Table1Backup AS SELECT * FROM Table1");
        tx.executeSql("CREATE TABLE CustomersBackup AS SELECT * FROM Customers");
        tx.executeSql("CREATE TABLE ItemsBackup AS SELECT * FROM Items");
       });
      }
      

    【讨论】:

      【解决方案2】:

      我可能遵循以下方法,这更清洁;也成功回滚了整个事务

      db.transaction(function(tx) {
        tx.executeSql("DROP TABLE if exists Table1Backup");
        tx.executeSql("CREATE TABLE if not exists Table1Backup AS SELECT * FROM " 
          +"Table1");
        tx.executeSql("CREATE TABLE CustomersBackup AS SELECT * FROM Customers");
        tx.executeSql("CREATE TABLE ItemsBackup AS SELECT * FROM Items");
      }).then(function(success){
          //do something
      }).catch(function(error){
         //transaction gets automatically rolled back
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-04
        • 2011-09-19
        • 2012-07-13
        • 2013-12-15
        • 2011-01-26
        • 2017-03-03
        • 2012-03-10
        相关资源
        最近更新 更多