首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node JS和node-firebird在一个事务中进行多次查询

Node JS和node-firebird在一个事务中进行多次查询
EN

Stack Overflow用户
提问于 2020-07-27 10:58:24
回答 1查看 507关注 0票数 0

我现在已经尝试了两天,但没有任何好的结果。

代码语言:javascript
复制
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似乎正在启动一个事务,但当在其中运行查询时,它只启动新的查询。

代码语言:javascript
复制
db.transaction(Firebird.ISOLATION_READ_COMMITED, await async  function(err,transaction) {
});

我希望是这样的:

代码语言:javascript
复制
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我才找不到这个信息。试图搜索示例,但它不存在。

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 20:29:47

我让它起作用了。

我使用promise和await。我在循环中使用它来迭代所有新的行项。这样做的一个问题是有一些奇怪的东西。当插入SQL使用返回ID时,它每隔一行崩溃一次。我花了一整天的时间才弄明白。在同一事务中执行多个插入操作时,在SQL中返回命令效果不佳。但它在没有事务的情况下工作得很好。node-firebird或Firebird引擎中的错误。我不得不用另一种方式来做。我首先从一个过程中手动执行select操作,生成一个新的最高行id + 1,然后在每次插入时执行rowID++。

这是我的解决方案:

代码语言:javascript
复制
  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);    
        });
    });
  }

我在循环中这样调用它:

代码语言:javascript
复制
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;
  }

在循环之后,我这样做了:

代码语言:javascript
复制
  transaction.commit(function(err) {
      if (err){
        reject(err.toString());
        transaction.rollback();
        db.detach();
        return false;
      }
    db.detach();
  });

最后,我以如下方式结束:

代码语言:javascript
复制
var result=await updateFromList();  
res.end(result);

updateFromList函数是开始插入或更新所有行函数。

当我没有意识到返回ID会使一切崩溃时,创建它并不容易。它花了大量的测试,并意识到它是崩溃的一切。

它现在工作得很好。能够使用事务非常重要,因为如果没有事务,数据将非常不稳定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63108086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档