Чтобы прояснить проблему, с которой у меня работает приложение nodejs / mssql, я попытался закодировать две функционально эквивалентные версии простого (подготовленного) оператора INSERT, заключенного в транзакцию.
Версия обратных вызовов работает - вставляет строку в мою базу данных Sql Server.
Версия async / await выдает ошибку -
TransactionError: Can't commit transaction. There is a request in progress.
Я пробовал много вариантов неудачной версии (переупорядочивание операторов там, где это возможно), но версия, включенная ниже, является версией, которая наиболее точно имитирует логику работающей версии обратного вызова.
Спасибо!
var sql = require('mssql'); // mssql: 4.1.0; tedious: 2.2.4; node: v8.4.0
var cfg = {
"db": "sqlserver",
"domain": "XXXXXX",
"user": "cseelig",
"password": "xxxxxx",
"server": "xxxxxx.xxxxxx.xxxxxx.xxxxxx",
"port": 1433,
"stream": false,
"options": {
"trustedConnection": true
},
"requestTimeout": 900000,
"connectionTimeout": 30000,
"pool": {
"max": 3,
"min": 0,
"idleTimeoutMillis": 30000
}
};
var statement = "insert into wng_dw.dbo.D_LIB_Google_Search_Query (query, LastUpdateDate) values (@query, GetDate())";
// I only run one or the other -
main1("12347"); // fails
main2("98765:); // works
async function main1(val) {
try {
const conn = await new sql.connect(cfg);
const transaction = new sql.Transaction();
await transaction.begin();
const ps = new sql.PreparedStatement(transaction);
ps.input('query', sql.VarChar(200));
await ps.prepare(statement);
await ps.execute( {"query": val} );
await ps.unprepare();
await transaction.commit();
sql.close;
} catch(err){
console.log("Error: " + err);
};
process.exit(0);
}
async function main2(val) {
sql.connect(cfg, err => {
const transaction = new sql.Transaction();
transaction.begin(err => {
const ps = new sql.PreparedStatement(transaction);
ps.input('query', sql.VarChar(200));
ps.prepare(statement, err => {
ps.execute( {"query": val}, (err, result) => {
ps.unprepare(err => {
transaction.commit(err => {
sql.close();
});
});
});
});
});
});
}
ps.prepare()
иps.execute()
возвращают обещание? К вашему сведению, вы делаетеawait ps.unprepare
, что, вероятно, должно бытьps.unprepare()
.await
ждет чего-то, только если ожидает обещания. - person jfriend00   schedule 14.02.2018