相关疑难解决方法(0)

SqlConnection如何管理IsolationLevel?

这篇MSDN文章指出:

隔离级别具有连接范围范围,并且一旦设置为与SET TRANSACTION ISOLATION LEVEL语句的连接,它将保持有效,直到连接关闭或设置了另一个隔离级别.关闭连接并返回到池时,将保留最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别.重新使用池连接的后续连接使用在连接池时生效的隔离级别.

SqlConnection的类有任何成员可能持有的隔离级别.那么连接如何知道在哪个隔离级别运行?

我问这个的原因是因为以下情况:

  1. 我在Serializable模式下使用TransactionScope打开了一个事务,比如"T1".
  2. 打开T1的连接.
  3. T1完成/处理,连接返回连接池.
  4. 在同一连接上调用另一个查询(从连接池获取后),此查询以可序列化模式运行!

问题:

  1. 汇集连接如何知道与之相关的隔离级别?
  2. 如何将其还原回其他一些事务级别???

解决方案:
池化连接返回可序列化隔离级别的原因是由于以下原因:

  1. 你有一个连接池(让我们说CP1)
  2. CP1可能有50个连接.
  3. 从CP1中选择一个连接C1并使用Serializable执行它.此连接现在已设置其隔离级别.无论您做什么,都不会重置(除非此连接用于执行不同隔离级别的代码).
  4. 执行查询后,C1(Serializable)返回CP1.
  5. 如果再次执行步骤1-4,则使用的连接可能是除C1之外的其他连接,假设为C2或C3.因此,它的隔离级别也将设置为Serializable.
  6. 因此,慢慢地,Serialzable在CP1中设置为多个连接.
  7. 当您执行未进行显式隔离级别设置的查询时,从CP1中选择的连接将决定隔离级别.例如,如果此类查询请求连接并且CP1使用C1(Serializable)执行此查询,则此查询将在Serializable模式下执行,即使您未明确设置它.

希望能够澄清一些疑惑.:)

.net c# sql-server ado.net transactions

21
推荐指数
3
解决办法
1万
查看次数

标签 统计

.net ×1

ado.net ×1

c# ×1

sql-server ×1

transactions ×1