首页 > 解决方案 > 从 JAVA setAutoCommit(false) 迁移到 nodejs knex (SQL Server)

问题描述

我正在为我工​​作的公司编写应用程序服务器......我们正在conn.setAutoCommit(false);另一个用 Java 编写的服务器应用程序中使用,我正在寻找在 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`);

如果出现错误,我会将它打包到一些调用回滚的函数中......它或多或少是一样的吗?

标签: javanode.jssql-serverknex.js

解决方案


你为什么要那样做?

您可以实际启动真正的事务,将所有插入查询发送到哪里并最终提交该真正的事务,而不是始终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
});

推荐阅读