Transaction Global in Node-Firebird



我用的是" node-firebird ";在我的Firebird 2.5项目中,我想在一些批次中使用单个事务进行多个插入或更新,但我不能使用全局事务。有人能帮我一下吗?

这是正式示例中的单一形式:

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();
});
});
});

});

I trying this

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
}

我运行这个测试

async function  test(){
await NewTransaction();
console.log('Transacao Global',TransactionGlobal);
QueryExecTransaction(`insert into tabparametros(codigo,nome,valor) values (0,'teste1','')`);
CommitTransaction();
}
test();

但是我收到了这个错误:

(node:9232) UnhandledPromiseRejectionWarning: Error: invalid transaction handle (expected explicit transaction start)

我设法解决了,改动是在" committing ";和其他小改动

代码 下面的

//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();

最新更新