我正在使用SQLite创建一个Ionic 2应用程序。我已经能够成功地执行命令、创建表和在数据库中插入记录。现在,我正在尝试插入一些父记录和详细信息记录,并且我想在事务中执行此操作,以便在插入子记录时发生任何错误时,我不会有损坏的父记录。
好吧,根据此链接(https://github.com/litehelpers/Cordova-sqlite-storage(,我可以通过以下方式使用事务:
db.transaction(function(tx) {
tx.executeSql("Insert into ParentTable(ParentName) values ('name')");
tx.executeSql("Insert into ChildTable(ParentID, ChildName) values (0, 'value1')");
}, function(error) {
console.log('Transaction ERROR: ' + error.message);
}, function() {
console.log('Transaction OK');
});
问题是我需要从第一个插入中获取 ParentID 以在第二个插入中使用。insertSQL命令有一个回调,所以我写了下面的代码:
db.transaction(function(tx)
{
tx.executeSql("Insert into ParentTable(ParentName) values ('name')",
function(tx, rs)
{
/* Location 1 */
var parentID = rs.insertId;
tx.executeSql("Insert into ChildTable(ParentID, ChildName) values (?, 'value1')", [parentID]);
});
/* Location 2 */
}, function(error) {
console.log('Transaction ERROR: ' + error.message);
}, function() {
console.log('Transaction OK');
});
所以,这就是我的疑问。由于 executeSql 是异步的,因此位置 2 将在位置 1 之前执行。 问题是:当db.transaction
超出范围时,事务是否会在位置 2 之后完成? 如果是,位置 1 将在事务完成后执行,那么如何使其在事务内执行呢?
如果不是,何时提交或回滚?
你必须使用 promise 来级联两个异步任务。
你必须使用两个结果。
db.transaction(function (tx) {
tx.executeSql("Insert into ParentTable(ParentName) values ('name')",[],
function (tx, result) {
tx.executeSql("Insert into ChildTable(ParentID, ChildName) values (?, 'value1')", [result.insertId],
function (tx, result) {
console.log(result);
},
function (error) {
console.log(error);
});
},
function (error) {
console.log(error);
});
});