首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server的读取提交快照与快照

Server的读取提交快照与快照
EN

Database Administration用户
提问于 2013-12-08 16:56:52
回答 2查看 11.4K关注 0票数 28

我研究了Server的READ COMMITTED SNAPSHOTSNAPSHOT隔离级别之间的差异,发现了以下资源:

选择基于行版本控制的隔离级别

对于大多数应用程序,建议使用行版本控制进行读提交隔离,而不是快照隔离,原因如下:

  • 它比快照隔离占用更少的tempdb空间。
  • 快照隔离容易发生不适用于使用行版本控制读取已提交隔离的更新冲突。当运行在快照隔离下的事务读取然后由另一个事务修改的数据时,快照事务对相同数据的更新将导致更新冲突,事务终止并回滚。这与使用行版本控制的读提交隔离无关。

我对这些话题有些陌生,但我似乎无法理解上述链接中的两个要点。

  1. 为什么对这些模式,tempdb空间会有所不同?其中一个存储的粒度版本比另一个要多吗?
  2. 为什么快照隔离更容易发生更新冲突?
EN

回答 2

Database Administration用户

回答已采纳

发布于 2013-12-08 20:59:09

  1. READ COMMITTED SNAPSHOT在每个语句之后使用一个新快照。这意味着较少的行版本被保存。(您从文档中引用的声明有点误导,因为它表明这始终是正确的--只有在长期运行的SNAPSHOT事务中才是正确的。)快照行版本是在写入时创建的。读取不会影响将哪些内容放入tempdb中。作家不可能预见到将来会发生什么事。读者只影响那些可以被清除的东西。
  2. SNAPSHOT事务T1写入另一个事务T2T1启动和T1尝试写入之间的时间内修改的行时,语句将失败,出现更新冲突错误。这是一个乐观的并发模型。使用READ COMMITTED SNAPSHOTT1将等待T2释放该行上的X锁并正常继续。
票数 22
EN

Database Administration用户

发布于 2015-05-13 13:48:33

快照和已提交的快照之间的另一个区别是以下内容。

  1. 快照

在第一届会议上

设置TRAN隔离级别快照开始从TB1选择*..

在第二届会议上

更新TB1集名称=名称+ 'test‘,其中id =1

在第一届会议上

从TB1中选择* --这将返回ID = 1的值名称,而不是name + 'test‘提交TRAN

在read提交的快照中,会话1中的第一个select将返回id =1的名称,第二个select将返回name + 'test‘。

因此,在快照隔离中,SQL SERVER在事务开始时执行快照,并在整个事务期间从该快照中读取快照。

在read提交快照中,为事务期间的每个SELECT语句拍摄快照。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/54680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档