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


8

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

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

这是不矛盾的段落(“直到”还是“保留”)?

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

  • 默认隔离级别将具有任意值(池中的不同连接将具有不同的隔离级别,并且其值将取决于重新打开的连接)?
  • 还是池中所有连接的所有默认值都将更改为最后一个?但是又是未知数吗?

Answers:


14

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

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

这种行为虽然令人困惑,但显然是设计使然。


从来没有见过那些“必须明确”和“最好是明确”在MSDN文章,书籍,博客,文件等
Fulproof

5

这是不矛盾的段落(“直到”还是“保留”)?

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

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

如果要重新使用池连接,则可以,“预先存在”的隔离级别是上次关闭池连接时生效的隔离级别。最佳实践是明确设置连接时所需的隔离级别。

还是池中所有连接上的所有默认值都将更改为最后一个?但是又是未知数吗?

没有。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.