我正在为我的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”已经存在。问题是,为什么交易没有回滚?我可以以某种方式强制事务回滚出错吗?
我的陈述中是否有错误?
答案 0 :(得分:4)
要回滚整个事务,您的错误处理回调函数应返回true
,如here所述:
每次查询错误回调
每个查询错误处理回调是 相当直截了当。如果回调返回true,则整个 交易回滚。如果回调返回false,则 交易继续,好像什么都没有出错。
因此,如果您正在执行可选的查询 - 如果失败 该特定查询不应导致事务失败 - 您 应该传递一个返回false的回调。如果失败了 查询应该导致整个事务失败,你应该传入 返回true的回调。
现在错误处理程序返回undefined
(因为没有明确的return
语句),因此只会跳过受影响的操作。