在尝试使用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。别担心,我们将把它改为不再是静态的。只是想知道这是否可能导致我们遇到的问题。
答案 0 :(得分:0)
根据MSDN documentation for SqlConnection:
“此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证所有实例成员都是线程安全的。”
所以,是的,从多个线程访问相同的SqlConnection
实例将是一个问题(甚至间接地通过SqlCommand
)。