【问题标题】:Does SqlConnection processes queries in parallel?SqlConnection 是否并行处理查询?
【发布时间】:2015-07-27 23:30:21
【问题描述】:

如果我打开一个SqlConnection 到 SQL Server,然后从多个后台线程发出多个查询,所有查询都使用一个连接 - 这些查询是否会按顺序执行(不关心顺序)?

具体来说,如果我在一个查询开始时更改隔离级别,然后在该查询结束时将其恢复 - 此隔离级别是否有可能适用于其他查询?

我认为不是,但想确认。

SQL Server 2008 R2

我说的是System.Data.SqlClient.SqlConnection

【问题讨论】:

  • SqlConnection 不是线程安全的。你不应该在多线程上使用它。您应该改为为每个线程创建一个连接。
  • 在多个线程上使用 SqlConnection 对象的唯一安全方法是不要在超过 1 个线程上同时使用它。是的,您在一个线程上更改的任何状态或配置都会​​“泄漏” " 以这种方式发送到任何后续线程。
  • @LasseV.Karlsen 使用 async/await 怎么样?我认为 THX-1138 是指多个查询在同一连接下同时运行的可能性。
  • 我不知道 async/await 会如何改变我的答案,只是说如果你真的问如果我在同一个线程上对同一个连接执行多个异步查询会发生什么,那么我不会不知道。

标签: sql sql-server sql-server-2008-r2 sqlconnection


【解决方案1】:

加载的问题,一个明确的答案是不可能的,因为正如@LasseV.Karlsen 所说,SqlConnection 不是线程安全的,所以行为将是不可预测的。我过去曾尝试过类似的场景,但失败了。这是我认为您问题中的参数会发生的情况。

SqlConnection 是否并行处理查询?

不,它不知道怎么做,因为它不是为这项任务而设计的。尽管可以构建一个以这种方式使用它的流程这一事实很诱人。

这些查询是否会按顺序执行

是的。 SQL 引擎将按照收到的顺序执行查询。虽然您的连接对象可能不知道将结果传递回哪个线程,但您会得到可怕的“对象引用错误”。

此隔离级别是否有可能适用于其他查询

是的。如果您更改分配给 SqlConnection 的事务对象的隔离级别,然后您的一个线程尝试使用该连接,它将默认具有该隔离级别。此时,辅助线程执行此操作的时间超出您的控制范围。您可以为每个命令分配一个事务(从而根据需要获得唯一的隔离级别),但您仍然会遇到连接不是线程安全的问题。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多