node.js - Node.js MS SQL 事务
问题描述
任何人都可以帮助在 Node.js 中实现 MS SQL 事务。我试图在一个承诺中执行多个存储过程。
方法一
const executeProcedure = async (data1, data2) => {
try {
// sql connection
let dbConn = new sql.ConnectionPool(config));
await dbConn.connect();
let transaction = new sql.Transaction(dbConn);
await transaction.begin().then(async()=> {
// tranaciton create
// begin tran
let result = await insertOperation(transaction, data1);
let result2 = await updateOperation(transaction, data2);
let result1 = await Promise.all([result, result2]);
await transaction.commit();
dbConn.close();
}).catch(async(err)=> {
await transaction.rollback();
dbConn.close();
throw err;
});
return {};
}
catch (error) {
throw(error);
}
}
方法二
const insertOperation = async (transaction,data1) => {
return new Promise((resolve, reject) => {
try {
var request = new sql.Request(transaction);
request.input('data1' , sql.NVarChar(40) , data1)
.execute('dbo.insertOperation').then((recordSet) => {
resolve(recordSet.recordsets);
}).catch((err) => {
reject(err);
});
}
catch (error) {
reject(error);
}
});
}
方法三
const updateOperation = async (transaction,data2) => {
return new Promise((resolve, reject) => {
try {
var request = new sql.Request(transaction);
request.input('data2' , sql.NVarChar(40) , data2)
.execute('dbo.updateOperation').then((recordSet) => {
resolve(recordSet.recordsets);
}).catch((err) => {
reject(err);
});
}
catch (error) {
reject(error);
}
});
}
现在我收到此错误 无法回滚事务。有一个请求正在进行中。
任何人请帮我解决这个问题
解决方案
@ikhvjs 请同时检查以下用例
try {
request.input("data", sql.NVarChar(40), data1);
const result = await request.execute("dbo.insertOperation");
return result.recordsets;
} catch (err) {
throw err;
}
};
const updateOperation = async (request, data2) => {
try {
request.input("data", sql.NVarChar(40), data2);
const result = await request.execute("dbo.updateOperation");
return result.recordsets;
} catch (err) {
throw err;
}
};
const executeProcedure = async (data1, data2) => {
try {
// sql connection
const dbConn = new sql.ConnectionPool(config);
await dbConn.connect();
const transaction = new sql.Transaction(dbConn);
try {
await transaction.begin();
const request = new sql.Request(transaction);
const results = await Promise.all([
insertOperation(request, data1),
updateOperation(request, data2),
]);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
} finally {
await dbConn.close();
}
} catch (error) {
throw error;
}
};```
推荐阅读
- javascript - 选择将自动显示子数据的父 JSON 数据
- java - 使用 Spring Boot 的方法级访问控制
- powershell - 测试路径 -isValid 在 UNC 根共享上失败
- kotlin - Firestore / Kotlin FieldValue arrayRemove() + Firestore 定价
- regex - PHP regex 环顾四周,匹配多个匹配项
- flutter - 如何在颤动的下拉列表中添加阴影或底部边距?
- webpack - LodashModuleReplacementPlugin
- python - 为什么多索引数据框会在选择后返回所有索引?
- reactjs - “元素”类型缺少“SVGSVGElement”类型的以下属性
- python - 尝试在 Django 模板中调整图像大小时,连接路径位于基本路径组件之外