2

我正在为我的 Phonegap 应用程序开发一些数据库操作。我正在测试 SQLite 的事务功能,有一点我不明白。

这是一笔交易中的示例:

dbObj.dbConnection.transaction(function (tx) {
    tx.executeSql('INSERT OR IGNORE INTO foo (id, text) VALUES (?, ?)', [6,"aaalabala6"], function(tx, results) {
         document.write("make insert<br>");
      }, function (tx, err){
        alert(err.message);
      });

    tx.executeSql('CREATE TABLE foo (id unique, text)', [], function(tx, results) {

    }, function (tx, err){
        console.log(err.message); // here an error - table already exists
    });

    tx.executeSql('INSERT OR IGNORE INTO foo (id, text) VALUES (?, ?)', [7,"aaalabala7"], function(tx, results) {
         document.write("make insert<br>");
      }, function (tx, err){
        alert(err.message);
      });
});

中间 SQL 查询抛出错误(无法准备语句(1 表 foo 已存在)),因为表“foo”已存在。问题是,为什么事务不回滚?我可以以某种方式强制事务回滚错误吗?

我的陈述中有错误吗?

4

1 回答 1

4

要回滚整个事务,您的错误处理回调函数应该返回true如下所述:

每次查询错误回调

每个查询的错误处理回调相当简单。如果回调返回 true,则整个事务将回滚。如果回调返回 false,则事务继续进行,就好像没有出错一样。

因此,如果您正在执行一个可选的查询——如果该特定查询的失败不应导致事务失败——您应该传入一个返回 false 的回调。如果查询失败导致整个事务失败,则应传入一个返回 true 的回调。

现在错误处理程序返回undefined(因为没有明确return的声明),所以只有受影响的操作被跳过。

于 2012-12-23T16:02:55.100 回答