是否可以在异步中提交/回滚SqlTransaction?

我正在尝试在异步中提交/回滚SqlTransaction 。 但它似乎不支持异步。 有没有办法让它成为异步而不使用原始SQL来启动事务?

看起来不像。 通过相关代码,所有其他方法都是异步通过(同步版本是特殊情况),而SqlTransaction和其他相关代码只是同步。 对于重叠的部分, SqlTransaction只是同步等待任务完成(例如,处理重新连接时)。

实际上,当您深入了解代码时,事务操作显式禁止任何异步操作,因此不包括异步事务操作似乎是设计使然。 如果您确实找到了一种解决方法,请记住这一点 – 系统不是为了允许并发操作而设计的,因此一旦您获得(任何)任务,请始终使用await

如果你想绕过这个,你必须一直深入到为SQL Server创建二进制消息(或者至少使用reflection来执行一些内部帮助器方法),这不是全部太容易了(当然,它需要您访问SqlConnection使用的内部TCP连接 – 并处理重新连接等)。

查看EntityFramework代码,他们的解决方案非常简单 – 他们只需调用Commit 。 这并不像它听起来那么疯狂 – 工作的主要部分是在ExecuteXXXAsync方法本身完成, Commit是“免费的” – 它只需要与服务器进行通信,这通常不会太昂贵。

鉴于这些限制,您的性能仍然不会受到明显影响 – 如果您有一些并发Commit ,您的线程池可能必须分配一个或两个线程,但替代方案会更加痛苦。

 using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { . . . }