从哪里获取数据,使用硬盘或数据页中的NOLOCK option..tables

时间:2015-01-29 03:56:40

标签: sql-server

这可能是一个愚蠢的问题,但如果我们使用WITH(NOLOCK)选项,sql server从哪里提取数据......磁盘或数据页面。

begin transaction
Update table1
set col1 = 'abc'

在上面的代码中,我没有给出Commit或rollback语句,因此数据页面将被锁定。但是使用NOLOCK选项,我可以读取尚未提交的记录。 select * from Table1 with(NOLOCK)似乎从表中读取数据但是Records仅在commit语句之后转到表中,在这种情况下我还没有发出任何commit语句。所以我的问题是,在这种情况下,sql server从DISK或数据页中读取修改后的数据。

根据我的理解,sql遵循以下步骤:

  1. 当发出像INSERT UPDATE或DELETE这样的DML语句时,如果找不到数据页中的记录,则首先会在数据页中加载记录。

  2. 检查约束规则。

  3. 完成数据页面的修改。

  4. 交易记录在交易记录中完成。

  5. SQl服务器将数据写入硬盘。

  6. 发布也记录在事务日志中的检查点。

1 个答案:

答案 0 :(得分:2)

您错过了SQL的一些细微之处。未提交的更改确实可以转到磁盘,而不是数据库数据文件(ndf / ndf),但即使这与此问题无关。 WITH (NOLOCK)个查询可以读取任何正在进行的事务中的数据,无论它们是否已被提交。他们还可以跳过已删除但尚未提交的数据。如果事务被回滚,或者如果您担心可能从事务中获得某些结果而不从同一事务中获取其他结果,则这只会产生影响。