静态SqlDBConnection可以导致线程获取另一个线程的结果集吗?

时间:2012-03-26 18:33:33

标签: asp.net sqlconnection

在尝试使用ASP.NET项目调试问题时,同事注意到一个方法正在实例化静态SqlConnection。

如果多个线程同时使用相同的SqlConnection,一个线程的SqlCommand是否可能意外地从另一个线程的SqlCommand获取结果集?

例如,考虑对同一个ASP.NET页面的两个并发请求:

请求1:

Dim Shared DbConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("DbConnectionString"))
Dim Query As SqlCommand = New SqlCommand("EXEC up_ShowReportInMenu 'abc',...", DbConnection)
...
Dim Reader As SqlDataReader = Query.ExecuteReader

请求2:

Dim Shared DbConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("DbConnectionString"))
Dim Query As SqlCommand = New SqlCommand("EXEC up_ShowReportInMenu 'def',...", DbConnection)
...
Dim Reader As SqlDataReader = Query.ExecuteReader

请求2中的Reader是否可能会意外地从请求1中的SqlCommand执行的查询中访问结果集?

P.S。别担心,我们将把它改为不再是静态的。只是想知道这是否可能导致我们遇到的问题。

1 个答案:

答案 0 :(得分:0)

根据MSDN documentation for SqlConnection

“此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证所有实例成员都是线程安全的。”

所以,是的,从多个线程访问相同的SqlConnection实例将是一个问题(甚至间接地通过SqlCommand)。