从JAVA setAutoCommit(false)移至nodejs knex(SQL Server)

时间:2018-12-07 11:52:56

标签: java node.js sql-server knex.js

我正在为我所工作的公司编写应用程序服务器... 我们正在另一个用Java编写的服务器应用程序中使用conn.setAutoCommit(false);, 我正在寻找在nodejs中做到这一点。 在Java应用程序中,我们像这样使用它:

conn.setAutoCommit(false);

// SQL INSERT #1
// SQL INSERT #2
// SQL UPDATE #1
// SQL INSERT #3
// SQL INSERT #4
// SQL UPDATE #2

conn.commit();
conn.setAutoCommit(true);

在nodejs中,如果我要做同样的事情吗? 我想到了这样的东西,但我不知道它是否会以相同的方式工作(我们正在使用SQL Server);

knex.raw(`SET IMPLICIT_TRANSACTIONS OFF`);

// SQL INSERT #1
// SQL INSERT #2
// SQL UPDATE #1
// SQL INSERT #3
// SQL INSERT #4
// SQL UPDATE #2

knex.raw(`COMMIT TRANSACTION`);
knex.raw(`SET IMPLICIT_TRANSACTIONS ON`);

我会将其打包到某个函数中,如果出现错误,该函数将调用回滚...会大致相同吗?

1 个答案:

答案 0 :(得分:0)

您为什么要那样做?

您实际上可以启动真正的事务,在该事务中发送所有插入查询并最后提交该真正的事务,而不是总是为IMPLICIT_TRANSACTIONS OFF设置应同时提交的查询顺序。

await knex.transaction(async (trx) => {
    await trx('table').insert(...);
    await trx('table').update(...);
    await trx('table').insert(...);
    // when function returns implicit promise all the 
    // inserts and updates will be committed
    // if an exception is thrown and promise returned 
    // by this async function rejects, then transaction will be rolled back
});