【问题标题】:Moving from JAVA setAutoCommit(false) to nodejs knex (SQL Server)从 JAVA setAutoCommit(false) 迁移到 nodejs knex (SQL Server)
【发布时间】:2018-12-07 11:52:56
【问题描述】:

我正在为我工​​作的公司编写应用程序服务器... 我们在另一个用 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`);

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

【问题讨论】:

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


    【解决方案1】:

    您为什么要这样做?

    您可以实际启动真正的事务,而不是为查询序列设置始终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
    });
    

    【讨论】:

    • 如果这个代码:global.transRaw = (...t)=>{ let done = false; DB.transaction(async (trx) => { for (let i = 0; i < t.length; i++) { const element = t[i]; await trx.schema.raw(element); } done = true; }) while (!done) { deasync.sleep(3); } } transRaw( 'query', ' qery', ... ) 可以工作,那很好......但如果我能像我在第一篇文章中写的例子那样编写代码会更好,因为我们有 1000 个库从 2005 年开始用 js 编写(rhino + java),他们必须在 nodejs 中工作
    • 您无法轻松决定应将所有这些查询发送到哪个连接,因此您必须处理从池中获取连接并手动将其返回,以便能够像原始问题中那样运行代码。不过也不是不可能。但是,如果您打算使用knex 来运行原始 SQL Server 查询,那么您最好直接使用tedious 驱动程序。
    • hmmm okey 像这样的查询怎么样:SELECT * FROM Serial_Numbers where id in (?) AND id_type in (?) 在 knex 我可以使用 raw 像 DB.raw(sql, [[1,2,3,4,5,6,667],['t1','t2','t4']]) 这样tedious 在那种情况下怎么样?
    猜你喜欢
    • 2012-09-04
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2011-06-17
    • 2014-05-24
    • 2014-04-25
    • 2010-10-14
    相关资源
    最近更新 更多