我现在已经尝试了两天,但没有任何好的结果。
transaction.query("INSERT INTO INVOICE (INVOICE_NO,INVOICE_NO_TMP,UNIT_TYPE,UNIT_TYPE_TEXT,TAX_PERCENT,QTY,SALE_PRICE,SERIALNUMBER,DISCOUNT,PARTNO,PARTNO_ID,DESCRIPTION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) RETURNING ID",array, function(err, result) {
if (err){
res.end(err.toString());
transaction.rollback();
db.detach();
return result;
}
})当我执行一个新的查询时,它只启动一个新的事务,并且我不能回滚或提交。我只收到这样的消息:无效的事务句柄(期望显式事务启动)
如何在每次执行新查询时保留第一个事务?db.transaction似乎正在启动一个事务,但当在其中运行查询时,它只启动新的查询。
db.transaction(Firebird.ISOLATION_READ_COMMITED, await async function(err,transaction) {
});我希望是这样的:
transaction.query("INSERT INTO INVOICE (INVOICE_NO,INVOICE_NO_TMP,UNIT_TYPE,UNIT_TYPE_TEXT,TAX_PERCENT,QTY,SALE_PRICE,SERIALNUMBER,DISCOUNT,PARTNO,PARTNO_ID,DESCRIPTION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) RETURNING ID",array, function(err, result) {
if (err){
res.end(err.toString());
transaction.rollback();
db.detach();
return result;
}
})
transaction.query("INSERT INTO INVOICE (INVOICE_NO,INVOICE_NO_TMP,UNIT_TYPE,UNIT_TYPE_TEXT,TAX_PERCENT,QTY,SALE_PRICE,SERIALNUMBER,DISCOUNT,PARTNO,PARTNO_ID,DESCRIPTION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) RETURNING ID",array, function(err, result) {
if (err){
res.end(err.toString());
transaction.rollback();
db.detach();
return result;
}
})
transaction.commit(function(err) {
if (err)
transaction.rollback();
else
db.detach();
});使用相同的事务。我试了试,但没有成功。我发现对于mySQL来说这很简单,但在node-firebird中并非如此。我查看了github中的测试索引,其中包含事务和多个插入,但这是完全错误的。这个测试没有展示如何在代码块之外使用相同的事务,所以它不是有用的信息。它不适用于遍历列表数组和执行插入操作。只有node-firebird我才找不到这个信息。试图搜索示例,但它不存在。
发布于 2020-07-29 20:29:47
我让它起作用了。
我使用promise和await。我在循环中使用它来迭代所有新的行项。这样做的一个问题是有一些奇怪的东西。当插入SQL使用返回ID时,它每隔一行崩溃一次。我花了一整天的时间才弄明白。在同一事务中执行多个插入操作时,在SQL中返回命令效果不佳。但它在没有事务的情况下工作得很好。node-firebird或Firebird引擎中的错误。我不得不用另一种方式来做。我首先从一个过程中手动执行select操作,生成一个新的最高行id + 1,然后在每次插入时执行rowID++。
这是我的解决方案:
var addItems= async function (i,params,ID){
return new Promise((resolve, reject) => { // Important for waiting for the result
var params2=[];
params2.push(rowID);
params2=params2.concat(params);
transaction.query("INSERT INTO INVOICE (ID, INVOICE_NO,INVOICE_NO_TMP,UNIT_TYPE,UNIT_TYPE_TEXT,TAX_PERCENT,QTY,SALE_PRICE,SERIALNUMBER,DISCOUNT,PARTNO,PARTNO_ID,DESCRIPTION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?) ",params2, function(err, result) {
if (err){
transaction.rollback();
db.detach();
reject(err.toString());
return false;
}
resolve(true);
});
});
}我在循环中这样调用它:
var result=await addItems(i,params,invoice.head[0].INVOICE_NO_TMP)
if (result==true){
rowID++;
}else{
transaction.rollback();
reject(result.toString());
break;
return false;
}在循环之后,我这样做了:
transaction.commit(function(err) {
if (err){
reject(err.toString());
transaction.rollback();
db.detach();
return false;
}
db.detach();
});最后,我以如下方式结束:
var result=await updateFromList();
res.end(result);updateFromList函数是开始插入或更新所有行函数。
当我没有意识到返回ID会使一切崩溃时,创建它并不容易。它花了大量的测试,并意识到它是崩溃的一切。
它现在工作得很好。能够使用事务非常重要,因为如果没有事务,数据将非常不稳定。
https://stackoverflow.com/questions/63108086
复制相似问题