java - 从 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`);
如果出现错误,我会将它打包到一些调用回滚的函数中......它或多或少是一样的吗?
解决方案
你为什么要那样做?
您可以实际启动真正的事务,将所有插入查询发送到哪里并最终提交该真正的事务,而不是始终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
});
推荐阅读
- reactjs - 开玩笑的不一致快照
- javascript - 为什么我们在 Js 中需要回调函数 为什么我们不简单地在 Main 函数中调用函数?
- python - 在 Python 中,无法使用带有私钥和 Http 代理的 paramiko 访问 SSH
- csv - JMeter:如何根据列值读取 csv 文件中的特定行数据并将该列的值传递给采样器?
- swift - SwiftUI 目标视图的额外元素
- javascript - 创建允许导入单个模块的 Angular 9 库 (ng-packagr)
- javascript - 围绕 Javascript 中的“嵌套”try/catch 语句感到困惑
- ios - 如何在 Swift 中解决这个计时器问题?
- performance - 导出数据到csv文件:sqlplus vs sqlcl parallel vs pl/sql utl_file dbms_parallel_execute,哪个更快
- azure-mysql-database - 未找到 Azure 服务器名称