在尝试按顺序提交同一事务时,我遇到错误。我正在使用Node-firebird库。第一次已提交,但第二次我收到以下消息:
错误:
> invalid transaction handle (expecting explicit transaction start) at
> doCallback
> (C:\Ultra\PreVendaServerV2\node_modules\node-firebird\lib\index.js:1297:21)
> at
> C:\Ultra\PreVendaServerV2\node_modules\node-firebird\lib\index.js:3019:25
> at
> C:\Ultra\PreVendaServerV2\node_modules\node-firebird\lib\messages.js:151:25
> at search
> (C:\Ultra\PreVendaServerV2\node_modules\node-firebird\lib\messages.js:117:13)
> at
> C:\Ultra\PreVendaServerV2\node_modules\node-firebird\lib\messages.js:54:21
> at FSReqCallback.wrapper [as oncomplete] (fs.js:520:5) at
> FSReqCallback.callbackTrampoline (internal/async_hooks.js:126:14) {
> gdscode: 335544332, gdsparams: undefined当我收到同一事务的错误消息时,我正在尝试插入子对象。
public static async getTransaction(db: Database, ISOLATION_LEVEL?: number[]): Promise<Firebird.Transaction> {
if (!db) throw "There is no Connection with the database!";
const ISOLATION = ISOLATION_LEVEL ? ISOLATION_LEVEL : Firebird.ISOLATION_READ_COMMITED;
return new Promise(
(resolve, reject) => {
db.transaction(ISOLATION, function (err, transaction) {
if (err && LOG_SQL) { console.log(err) };
if (err) reject(err);
resolve(transaction);
});
});
}
public static async asyncInsert(insertSQL: string, params?: any[], insertChildrenCallback?: any, originObject?: any, transaction?: Firebird.Transaction, commit?: boolean) {
try {
const db = await FirebirdPromise.attach();
if (!transaction) transaction = await this.getTransaction(db);
const insertedId = await this.execQueryWithTransaction(insertSQL, transaction, params, originObject);
if (insertChildrenCallback) await insertChildrenCallback(insertedId, originObject, transaction, db);
if (commit) await this.tryCommit(transaction, db);
return new DatabaseResult({
status: DatabaseResult.RESULT_OK, message: null, data: insertedId
});
} catch (error) {
return new DatabaseResult({
status: DatabaseResult.RESULT_ERROR, message: error, data: null
});
}
}
public static async tryCommit(transaction: Firebird.Transaction, db: Database): Promise<Boolean> {
return new Promise(
(resolve, reject) => {
transaction.commit(function (err) {
if (err) {
if (LOG_SQL) console.log(err);
transaction.rollback();
reject(err);
throw err;
}
db.detach();
resolve(true);
});
});
}发布于 2020-11-25 18:24:16
看起来您正在尝试在多个函数调用中重用一个事务。试着这样做:
const db = await FirebirdPromise.attach();
transaction = await this.getTransaction(db);与从参数中获取事务并多次提交不同,您应该每次都生成事务,然后提交它。对于下一次插入,生成另一个事务。
https://stackoverflow.com/questions/64993699
复制相似问题