“当连接关闭并返回到池中时,保留最后一个 SET TRANSACTION ISOLATION LEVEL 语句的隔离级别”?

Ful*_*oof 9 sql-server transaction isolation-level connection-pooling snapshot-isolation

MSDN 在线文章“ SQL Server 中的快照隔离”指出:

  • “隔离级别具有连接范围的范围,一旦使用 SET TRANSACTION ISOLATION LEVEL 语句为连接设置,它将一直有效,直到连接关闭或设置另一个隔离级别。当连接关闭并返回到池中时,保留最后一个 SET TRANSACTION ISOLATION LEVEL 语句的隔离级别。重用池连接的后续连接使用在连接池时有效的隔离级别“

这不是自相矛盾的段落(“直到”与“保留”)吗?

那么,如果在关闭连接并将其返回到池后“保留了来自最后一个 SET TRANSACTION ISOLATION LEVEL 语句的隔离级别”,应该如何理解:

  • 默认隔离级别将具有任意值(池中的不同连接将具有不同的隔离级别,其值将取决于重新打开的连接)?
  • 或所有连接的所有默认值?游泳池会改成最后一个吗?但在手之前又很陌生?

Mar*_*ith 14

池中的连接将具有最后一个客户端设置的隔离级别以使用该连接。是的,真的有那么可怕。

总而言之,如果您更改连接的隔离级别,则必须READ COMMITTED在关闭之前将其显式设置回。更好的是在任何批处理开始时明确声明所需的隔离级别,以确保您的代码不会受到其他人草率的影响,并在最后将其恢复为默认值。

这种行为虽然令人费解,但显然故意设计的


Pau*_*ite 5

这不是自相矛盾的段落(“直到”与“保留”)吗?

对我来说不是,但我可以看到还有其他阅读方式。如果您希望更新文档以使其更清晰,请在Microsoft Connect上提出请求。这里的人不维护 Microsoft 文档。

默认隔离级别将具有任意值(池中的不同连接将具有不同的隔离级别,其值将取决于重新打开的连接)?

如果您正在重用池连接,那么是的,“预先存在的”隔离级别是池连接上次关闭时生效的隔离级别。最佳实践是在连接时显式设置所需的隔离级别。

或者池中所有连接的所有默认值都将更改为最后一个?但在手之前又很陌生?

不。