这篇MSDN文章指出:
隔离级别具有连接范围范围,并且一旦设置为与SET TRANSACTION ISOLATION LEVEL语句的连接,它将保持有效,直到连接关闭或设置了另一个隔离级别.关闭连接并返回到池时,将保留最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别.重新使用池连接的后续连接使用在连接池时生效的隔离级别.
该SqlConnection的类有任何成员可能持有的隔离级别.那么连接如何知道在哪个隔离级别运行?
我问这个的原因是因为以下情况:
问题:
解决方案:
池化连接返回可序列化隔离级别的原因是由于以下原因:
- 你有一个连接池(让我们说CP1)
- CP1可能有50个连接.
- 从CP1中选择一个连接C1并使用Serializable执行它.此连接现在已设置其隔离级别.无论您做什么,都不会重置(除非此连接用于执行不同隔离级别的代码).
- 执行查询后,C1(Serializable)返回CP1.
- 如果再次执行步骤1-4,则使用的连接可能是除C1之外的其他连接,假设为C2或C3.因此,它的隔离级别也将设置为Serializable.
- 因此,慢慢地,Serialzable在CP1中设置为多个连接.
- 当您执行未进行显式隔离级别设置的查询时,从CP1中选择的连接将决定隔离级别.例如,如果此类查询请求连接并且CP1使用C1(Serializable)执行此查询,则此查询将在Serializable模式下执行,即使您未明确设置它.
希望能够澄清一些疑惑.:)