JavaScript SQLite事务回滚

时间:2012-12-23 15:57:30

标签: javascript sqlite transactions

我正在为我的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”已经存在。问题是,为什么交易没有回滚?我可以以某种方式强制事务回滚出错吗?

我的陈述中是否有错误?

1 个答案:

答案 0 :(得分:4)

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

  

每次查询错误回调

     

每个查询错误处理回调是   相当直截了当。如果回调返回true,则整个   交易回滚。如果回调返回false,则   交易继续,好像什么都没有出错。

     

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

现在错误处理程序返回undefined(因为没有明确的return语句),因此只会跳过受影响的操作。