我目前有一个尝试将数据插入表中的事务。如果数据已经在表中,则引发约束失败错误并运行select以获取ID。
t2.executeSql('INSERT INTO books (book) VALUES (?);',
[record],
function (t2, r) { // SQL_successfulCallback
record = r.insertId;
},
function (t2, err) { // SQL_errorCallback
if (err.message !== 'constraint failed') { // insert failed because of other
// reason - fail transaction
console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.');
return true;
} else { // insert failed because data was already in the table
t2.executeSql('SELECT bookID FROM books WHERE book=?',
[record],
function (t, r) { // SQL_successfulCallback
record = r.rows.item(0).classificationID;
},
function (t, err) { // SQL_errorCallback
console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.');
return true;
}
);
return false;
}
}
);
我想加快交易速度,所以我想我会先看看数据是否在表格中。如果不是那么插入...
t2.executeSql('SELECT bookID FROM books WHERE book=?',
[record],
function (t2, r) { // SQL_successfulCallback
if (r.rows.length !== 0) {
record = r.rows.item(0).bookID;
} else {
t2.executeSql('INSERT INTO books (book) VALUES (?);',
[record],
function(t2, r){ // SQL_successfulCallbac
record = r.insertId;
},
function (t2, err) { // SQL_errorCallback
if (err.message !== 'constraint failed') { // insert failed because of other
// reason - fail transaction
console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.');
return true;
} else { // insert failed because data was already in the table
return false;
}
}
);
}
},
function (t, err) { // SQL_errorCallback
console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.');
return true;
}
);
......但它不起作用。此事务运行所有选择然后执行插入。如何使第二种方法有效?
答案 0 :(得分:0)
我假设交易正在排队请求。所以你的队列看起来像这样
选择1
选择2
选择3
然后当你提交你的交易时,在第一次调用之后就是这样。
选择2
选择3
插入1
插入2
插入3
这是因为调用插入的函数在select运行后被执行,直到事务提交但选择已经注册才会发生。
为了让它成为
SELECT1
insert1
SELECT2
insert2
我会为每个select语句创建一个单独的事务。