使用 Node.js 中的 mssql 模块,事务未按预期回滚

Transaction not rolling back as expected using the mssql module in Node.js

我实际上已经找到了这个问题的答案,只是想记录下我的发现。

问题原因如下:

let transaction = new sql.Transaction(pool);
await transaction.begin();
await pool.request (transaction).query (" *** SOME SQL *** ");
await transaction.rollback();

事务根本不会回滚。

为了解决这个问题,我最终使用了 new sql.Request (transaction) 而不是 pool.request (transaction)。代码将如下所示:

let transaction = new sql.Transaction(pool);
await transaction.begin();
await new sql.Request (transaction).query (" *** SOME SQL *** ");
await transaction.rollback();

我没有更深入地了解连接池如何工作的实际机制,但似乎与 sql.Request class 构造函数不同,pool.request 方法不取一个transaction参数(有知情者请告诉我们这是不是真的)。​​

更新

回去查看了mssql模块的源码,发现里面有一个request方法Transactionclass,所以另一种解决方案是:

let transaction = new sql.Transaction(pool);
await transaction.begin();
await transaction.request().query (" *** SOME SQL *** ");
await transaction.rollback();