首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node中的全局事务-Firebird

Node中的全局事务-Firebird
EN

Stack Overflow用户
提问于 2021-08-07 21:59:39
回答 1查看 71关注 0票数 0

我在我的Firebird 2.5项目中使用"node-firebird“,并且我希望在某些批处理中使用单个事务来执行多个插入或更新,但我不能使用全局事务。有人能帮我一下吗?

这是官方示例中的单个表单:

代码语言:javascript
复制
Firebird.attach(options, function(err, db) {

if (err)
    throw err;

// db = DATABASE
db.transaction(Firebird.ISOLATION_READ_COMMITED, function(err, transaction) {
    transaction.query('INSERT INTO users VALUE(?,?)', [1, 'Janko'], function(err, result) {

        if (err) {
            transaction.rollback();
            return;
        }

        transaction.commit(function(err) {
            if (err)
                transaction.rollback();
            else
                db.detach();
        });
    });
});

});

我试一下这个

代码语言:javascript
复制
const  NewTransaction=()=>{
  return new Promise((resolve, reject) => {
    
    firebirdPool.get((err, db) => {
      if (err) {
          reject(err);
        return;
      }
      
      DBGlobal=db;

      DBGlobal.transaction(Firebird.ISOLATION_READ_COMMITED, 
        function(err, transaction) {
          //here i trying save the transaction
          TransactionGlobal=transaction;

          if (err) {
            reject(err);
          return;
          }
          resolve(TransactionGlobal)
        });
    });//firebirdpool
  });//promisse
}//function



const CommitTransaction=()=>{
  return new Promise((resolve, reject) => {

    TransactionGlobal.commit(function(err) {
      if (err){
          transaction.rollback();
          reject(err);
          return;
      }
      else {
        DBGlobal.detach();
        resolve(true);
      }
    });//transaction

  });//promisse
}  


const RollbackTransaction=()=>{
  return new Promise((resolve, reject) => {

    try{
      TransactionGlobal.rollback();
      resolve(true);
    }
    catch(err){
      reject(err)
    }

  });//promisse
}


//usado com commit  
const QueryExecTransaction = (sql,arrayparams=[]) => {
  return new Promise((resolve, reject) => {

          TransactionGlobal.query(sql,arrayparams,function(err, result) {
  
              if (err) {
                  console.log('erro na execução da query');
                  TransactionGlobal.rollback();
                  reject(err);
                  return;
              }
              resolve(result);  
              return;
          });//query
          
  });//promisse
}

我用这个测试运行

代码语言:javascript
复制
async function  test(){
  await NewTransaction();
  console.log('Transacao Global',TransactionGlobal);
  QueryExecTransaction(`insert into tabparametros(codigo,nome,valor) values (0,'teste1','')`);
  CommitTransaction();
}
test();

但是我收到了这个错误:

(节点:9232) UnhandledPromiseRejectionWarning:错误:事务句柄无效(应显式启动事务)

EN

回答 1

Stack Overflow用户

发布于 2021-08-09 15:07:13

我设法解决了,更改是在“提交”和其他小的更改

下面的代码

代码语言:javascript
复制
//variaveis de "ambiente" salvas na raiz do projeto
//.env  e .env.testing
require('dotenv').config({  
    path: (process.env.NODE_ENV === "test")||(process.env.NODE_ENV === "development") ? ".env.testing" : ".env"
  })
  
  var Firebird = require('node-firebird');
  var fs = require('fs');
  var options = {};
   
  options.host = process.env.DB_HOST;
  options.port = process.env.DB_PORT;
  options.database = process.env.DB_DATABASE;
  options.user = process.env.DB_USER;
  options.password = process.env.DB_PASSWORD;
  
  options.lowercase_keys = false; // set to true to lowercase keys
  options.role = null;            // default
  options.pageSize = 4096;        // default when creating database
  
  //console.log(options);
  
  //Conexao
  // 5 = the number is count of opened sockets
  var firebirdPool = Firebird.pool(5, options);
  
  
  
  
  const  NewTransaction=()=>{
    return new Promise((resolve, reject) => {
      
      firebirdPool.get((err, db) => {
        if (err) {
            reject(err);
          return;
        }
        
        //aqui eu salvo o DB retornando
        //DBGlobal=db;
  
        db.transaction(Firebird.ISOLATION_READ_COMMITED, 
          function(err, transaction) {
            
            //aqui eu salvo a transacao retornada
            //TransactionGlobal=transaction;
  
            if (err) {
              reject(err);
            return;
            }
            resolve({transaction,db});
          });
      });//firebirdpool
    });//promisse
  }//function
  
  
  
  const CommitTransaction=(transaction,db)=>{
    return new Promise((resolve, reject) => {
  
      transaction.commitRetaining(function(err) {
        if (err){
            transaction.rollback();
            reject(err);
            return;
        }
        else {
          db.detach();
          resolve(true);
        }
      });//transaction
  
    });//promisse
  }  
  
  
  const RollbackTransaction=(transaction,db)=>{
    return new Promise((resolve, reject) => {
  
      try{
        transaction.rollback();
        db.detach();
        resolve(true);
      }
      catch(err){
        reject(err)
      }
  
    });//promisse
  }
  
  
  //usado com commit  
  const QueryExecTransaction = (transaction,sql,arrayparams=[]) => {
    return new Promise((resolve, reject) => {
  
        transaction.query(sql,arrayparams,function(err, result) {
    
                if (err) {
                    console.log('erro na execução da query');
                    transaction.rollback();
                    reject(err);
                    return;
                }
                resolve(result);  
                return;
            });//query
            
    });//promisse
  }
  
  
  
  
  
  
  async function  testa(){
    const {transaction,db}=await NewTransaction();
    //console.log('Transacao Global',transaction);
    let psql='';
    try{
        for (let i=1;i<101;i++){
        
            
            psql=`insert into tabparametros(codigo,nome,valor) values (0,'teste${i}-${new Date()}','')`

            if (i==79){
                //psql='forcando o erro';
            }
            
            await QueryExecTransaction(transaction,psql);


        }
        await CommitTransaction(transaction,db);
    }
    catch(e){
        console.log('Erro no SQL');
        console.log(e);

        await RollbackTransaction(transaction,db);
        
    }

    console.log('Finalizado')
  }
  testa();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68696418

复制
相关文章

相似问题

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