Cordova SQLite事务未回滚
对于混合移动应用程序中使用的数据库(由变量db表示),我有以下代码 SQLite数据库中没有Customers或Items表,因此第三条和第四条SQL语句会抛出一个错误,但表Table1Backup仍然会被创建为什么会发生这种情况,因为在这种情况下,事务中应该发生隐式回滚?Cordova SQLite事务未回滚,sqlite,cordova,hybrid-mobile-app,Sqlite,Cordova,Hybrid Mobile App,对于混合移动应用程序中使用的数据库(由变量db表示),我有以下代码 SQLite数据库中没有Customers或Items表,因此第三条和第四条SQL语句会抛出一个错误,但表Table1Backup仍然会被创建为什么会发生这种情况,因为在这种情况下,事务中应该发生隐式回滚? db.transaction(function(tx) { tx.executeSql("DROP TABLE if exists Table1Backup", [], success, error); tx
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);
}
我找到了答案。为了使事务在出错时回滚,在基于CORDOVA的混合应用程序中使用SQLITE时,必须遵循以下任一选项:
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
}
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");
});
}
我可能会遵循下面的方法,这更干净;还成功回滚整个事务
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
})