繁琐的MSSQL驱动程序,如何将事务级别设置为READ_COMMITTED_SNAPSHOT

时间:2016-11-10 20:30:55

标签: sql sql-server node.js database tedious

您是否可以通过Tedious驱动程序指定READ_COMMITTED_SNAPSHOT的事务隔离级别?我在这里看到了可用的隔离级别:http://tediousjs.github.io/tedious/api-connection.html#function_beginTransaction

但我知道READ COMMITTED中的SNAPSHOT选项与将隔离级别设置为SNAPSHOT不同。也就是说,我没有看到将交易级别设置为此的方法,而没有将其附加到每个进入的查询中,我显然不会这样做。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我对Tedious一无所知。但是,在SQL Server中,READ_COMMITTED_SNAPSHOT不是事务隔离级别。 READ_COMMITTED_SNAPSHOT是READ_COMMITTED的数据库选项。所以你需要做类似的事情:

SET READ_COMMITTED_SNAPSHOT ON

然后

SET TRANSACTION ISOLATION LEVEL READ_COMMITTED

答案 1 :(得分:0)

是的,到 2021 年,您似乎可以这样做。在这篇文章中,我指的是这个版本的 Node MSSQL 驱动程序:

"mssql": "^6.3.1"

https://www.npmjs.com/package/mssql

导入 'mssql/lib/isolationlevel' 时有五种可能的隔离级别:

module.exports = {
  READ_UNCOMMITTED: 0x01,
  READ_COMMITTED: 0x02,
  REPEATABLE_READ: 0x03,
  SERIALIZABLE: 0x04,
  SNAPSHOT: 0x05
}

以下是一种通过 Tedious 驱动程序为连接指定 READ_COMMITTED_SNAPSHOT 事务隔离级别或任何其他隔离级别的可能方法,该连接是从连接池中检索的:

  • 您从 mssql/lib/isolationlevel 导入隔离级别:

    import { READ_UNCOMMITTED } from 'mssql/lib/isolationlevel'

  • 我们假设您有一个连接池创建如下:

    export const poolPromise = new sql.ConnectionPool(dbConfig).connect();

  • 然后在每次连接检索后,您可以通过更改连接的配置选项来设置隔离级别:

      export async function executeSelectQuery(sqlQuery) {
          console.log('executeSelectQuery', sqlQuery)
          const conn = await createConn();
          conn.config.options.connectionIsolationLevel = READ_UNCOMMITTED
          const res = await conn.request().query(sqlQuery);
          return res ? res.recordset : [];
      }
    

我已使用此代码验证隔离级别是否确实已更改:

export async function executeSelectQuery(sqlQuery) {
    console.log('executeSelectQuery', sqlQuery)
    const conn = await createConn();
    conn.config.options.connectionIsolationLevel = READ_UNCOMMITTED
    const isolationLevelRes = await conn.request().query(`
    begin
        DBCC USEROPTIONS
    end
    `)
    console.log('isolationLevelRes after', isolationLevelRes.recordsets)
    const res = await conn.request().query(sqlQuery);
    return res ? res.recordset : [];
}

确实我可以在控制台上看到这个条目:

enter image description here