Questions tagged «snapshot-isolation»

1
如果在一个事务中对同一记录进行多次更新,那么将存储多少个版本?
根据Kimberly L. Tripp的MSDN文章,Neal Graves的“ 基于SQL Server 2005行版本控制的事务隔离 “ ... 特定记录的所有早期版本都链接在一个链表中;对于基于行版本控制的长期交易,每次访问都必须遍历该链接,以达到交易的一致版本行” 这在“了解行版本控制”部分中是通用的,可同时遵循“使用行版本控制提交的读取中的行版本控制”和“快照隔离中的行版本控制”部分。 此外,在仅通过SNAPSHOT中的多个事务(T1,T2,T3)对同一记录进行多次更新的情况下,给出了由于修改导致的行版本控制的示例。 如果只有一个事务多次(通过多个语句)更新一条记录,是否将存储(链接)多个版本存储,还是仅在拍摄SNAPSHOT“图像”时进行一个版本存储? 好吧,这个问题的答案应该立即回答我其他未解决的相关问题: 为什么行版本隔离使用记录版本的链接列表? RCSI使用的空间是否少于SNAPSHOT?为什么?

1
事务隔离级别快照与截断?
我希望有人可以阐明我在SNAPSHOT隔离与TRUNCATE上没有想到的这种行为。 数据库:允许快照隔离= True;读取已提交快照快照= False。 Procedure1(从具有大量连接的长时间运行的复杂SELECT替换表foo的内容): BEGIN TRAN; TRUNCATE TABLE foo; INSERT INTO foo SELECT...; COMMIT; Procedure2(从表foo中读取): SET TRANSACTION ISOLATION LEVEL SNAPSHOT; SELECT * FROM foo; 如果在执行Procedure2的同时正在运行Procedure1,则过程2将等待LCK_M_SCH_S(根据sp_WhoIsActive)等待,直到Procedure1完成。而当Procedure2确实完成时,它将引发此异常: 快照隔离事务在数据库'DatabaseName'中失败,因为自该事务开始以来,该语句访问的对象已由另一个并发事务中的DDL语句修改。不允许这样做,因为未对元数据进行版本控制。如果同时进行元数据更新和快照隔离,则可能导致不一致。 但是,Microsoft并未将TRUNCATE列为SNAPSHOT隔离下不允许的DDL语句:http : //msdn.microsoft.com/zh-cn/library/bb933783.aspx 显然,我并没有正确理解某些东西,因为我希望程序2的最佳情况会在TRUNCATE之前立即返回表中最近提交的数据,或者最坏的情况是被程序1阻止,然后返回程序的新内容。表。你能帮我吗?


3
“当连接关闭并返回到池时,保留来自最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别”?
MSDN在线文章“ SQL Server中的快照隔离 ”指出: “隔离级别具有连接范围的范围,并且一旦使用SET TRANSACTION ISOLATION LEVEL语句设置了连接,它将一直有效,直到关闭连接或设置另一个隔离级别为止。当关闭连接并返回到池中时,则保留了最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别。后续重用池化连接的连接将使用在池化连接时生效的隔离级别。” 这是不矛盾的段落(“直到”还是“保留”)? 然后,如果在关闭连接并将其返回到池之后,“ 保留了与最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别”,则应如何理解: 默认隔离级别将具有任意值(池中的不同连接将具有不同的隔离级别,并且其值将取决于重新打开的连接)? 还是池中所有连接的所有默认值都将更改为最后一个?但是又是未知数吗?
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.