首页 > 解决方案 > SqlConnection 支持多少并发语句

问题描述

SqlConnectionC#支持多少并发语句?

假设我正在开发运行 10 个线程的 Windows 服务。所有线程使用相同的SqlConnection对象但不同的SqlCommand对象,并在不同的表或相同的表但不同的数据上执行选择、插入、更新和删除等操作。它会起作用吗?单个SqlConnection对象能否同时处理 10 个语句?

标签: c#sql-servermultithreadingsqlconnectionsqlcommand

解决方案


C# SqlConnection 支持多少并发语句?

从技术上讲,您可以拥有多个“进行中”语句,但只有一个正在执行。

单个 SqlConnection 映射到 SQL Server 中的单个 Connection 和 Session。在 Sql Server 中,一个会话一次只能有一个活动的请求。如果启用 MultipeActiveResultsets,您可以在前一个查询完成之前启动一个新查询,但语句是交错的,永远不会并行运行。

MARS 支持在单个连接中交错执行多个请求。也就是说,它允许批处理运行,并且在其执行过程中,它允许执行其他请求。但是请注意,MARS 是根据交错定义的,而不是根据并行 执行定义的。

只能在明确定义的点切换执行。

https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver15

所以你甚至不能保证当一个语句被阻塞时另一个语句会运行。所以如果你想并行运行语句,你需要使用多个SqlConnections。

另请注意,单个查询可能使用并行执行计划,并且有多个任务并行运行。


推荐阅读