我们的数据库目前正在遇到阻塞、死锁和超时问题,我们正在缓慢地着手解决这些问题。我遇到了快照隔离级别的概念。我认为我们的应用程序还没有准备好阅读,但我确实认为ALLOW_SNAPSHOT_ISOLATION被打开了,某些带有set transaction isolation level snapshot标志的有问题的查询可能会有很大的帮助。在使用read提交快照启用时,有各种各样的警告需要进行测试,我理解其中的原因,但我只想检查一下打开ALLOW_SNAPSHOT_ISOLATION是否有任何问题。在我看来,没有任何东西会神奇地切换到使用快照隔离级别,就像读取提交的快照启用一样。如果我们将隔离级别设置为继续进行快照,只会影响查询/sprocs/etc。有人能确认或否认吗?
发布于 2017-08-29 22:21:56
打开ALLOW_SNAPSHOT_ISOLATION (或READ_COMMITTED_SNAPSHOT)数据库选项的缺点是为所有数据库事务维护行版本的额外开销。开销包括在tempdb中维护行版本存储和每行额外的14字节存储。这种开销在数据库引擎中基于行版本的隔离级别中有详细说明。
即使您不实际使用SNAPSHOT隔离,Server仍将在启用ALLOW_SNAPSHOT_ISOLATION的数据库中维护行版本,以防启动SNAPSHOT。行版本控制开销的总体性能和存储影响在很大程度上取决于您的工作负载和环境。它可能没有那么重要,可以阻止您使用SNAPSHOT隔离,但是您需要进行测试以确定对您的情况的影响。当然,并发性的好处可能会抵消成本。
发布于 2017-08-29 17:46:15
它将消除读写之间的所有阻塞。但是,如果在同一页上同时发生两次写操作,仍然会发生阻塞。这是无可奈何的。
在我的经验中,由于快照隔离(行版本控制)而增加的负载是微不足道的,行版本控制在减少阻塞读取器方面的好处也是巨大的。
发布于 2021-06-16 15:18:32
启用快照隔离时,将将旧行版本保存在tempdb中,直到可以使用它们的事务完成为止。因此,如果您意外地打开了一个事务,tempdb可以填充直到灾难发生。
https://stackoverflow.com/questions/45945067
复制相似问题