0
Posted on
Tuesday, September 13, 2016
by
醉·醉·鱼
and labeled under
sql
拜读完 https://www.simple-talk.com/sql/t-sql-programming/row-versioning-concurrency-in-sql-server/,快快记录一些东西,方便以后回忆。
- READ_COMMITTED_SNAPSHOT 和 SNAPSHOT都是基于snapshot的隔离级别
- 两种机制都会复制数据一个version到tempdb
- 在物理存储上,每条数据都会增加长度为14bytes的pointer和XSN
- pointer会指向之前的version,之前的version又会指向更早的version,直到最早的version。有点想HEAP里出现page split一样。
- SNAPSHOT机制减少了lock,增加了tempdb开销,间接增加UPDATE和DELETE的代价
- READ_COMMITTED_SNAPSHOT 可以避免脏读。是statement level的snapshot isolation。第二次读是可以读到另外TRAN里提交的改动。
- SNAPSHOT 可以避免脏读,不可重复读和幻读。是transaction level的snapshot isolation。第二次读到的和第一次读到的一致。
- 由于基于version,reader和writer互不block,但是writer还是会block writer。
- 正是由于SNAPSHOT可以重复读,会导致UPDATE CONFLICT。即UPDATE的时候其他session已经提交了改动,这个时候就会UPDATE CONFLICT。
- 开启READ_COMMITTED_SNAPSHOT需要关闭所有ACTIVE SESSION。
- 开启READ_COMMITTED_SNAPSHOT需要将代码里面的NOLOCK抹掉,并默认为READ COMMITTED隔离级别。
Post a Comment