使用 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();
我实际上已经找到了这个问题的答案,只是想记录下我的发现。
问题原因如下:
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();