SQL Server脏读方式数据提取---NOLOCK和READPAST
当对数据库中的数据进行读操作或修改时,数据库引擎使用专门的控制类型来保持数据库的完整性,称为锁机制。锁机制通过确保包含在一个事务中的数据库记录在该事务提交之前不能被其它事务修改来保证数据库的一致性。
在设计数据库应用时,你应该记住各种不同类型的锁及事务发生的不同隔离级别。通常情况下,SQL Server默认方式能够很好地完成你要使用的功能,不过,有些时候利用SQL语句在数据表上手工添加关于锁是如何应用的提示信息将是十分有用的。
本文主要介绍了两种数据表提示:NOLOCK和READPAST。我们将建立一个数据表用作例子中的查询数据表。执行列表A中的脚本建立一个SalesHistory数据表并添加一些数据。
NOLOCK
该数据表提示,也称为READUNCOMMITTED,只能用于SELECT语句。NOLOCK表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修改。
该语句的好处是它可以使数据库引擎不用在处理查询中的上锁问题,可以提高并发性并改善数据库性能,因为数据库引擎不用在维护共享锁的使用问题。存在的问题是因为该语句不能处理要读取的数据表的所有锁,所以一些“脏数据”或未被提交的数据潜在的可能被读取。
如果某个事务被滚回,那么应用了NOLOCK连接的数据读取操作将可以读取未提交的数据。这种类型的读取导致处理的不一致性会带来很多问题。这是你使用NOLOCK时应该了解的技巧。
作为一个负面影响,NOLOCK查询还可能带来读取“幻影”数据或读取在一个数据库读取事务中可以获得的但在另一个事务中可能被滚回的数据的风险。(我将在本系列文章的第二部分对这个负面影响进行详细说明。)
下面的例子展示了NOLOCK如何工作以及脏数据读取是如何产生的。在下面的脚本中,我用一个事务在SalesHistory数据表中插入一条记录。
BEGIN TRANSACTION
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('PoolTable', GETDATE(), 500)
这个事务仍旧是开放的,这意味着仍可以对插入数据表的记录上锁以阻止其它操作。在一个新的查询窗口中,运行下面的脚本,该脚本使用NOLOCK数据表提示返回SalesHistory数据表中的记录数。
SELECT COUNT(*) FROM SalesHistory WITH(NOLOCK)
返回记录数值为301。因为对SalesHistory数据表插入记录的事务还没有提交,所以我们可以撤销它。我通过使用下面的语句将事务滚回:
ROLLBACK TRANSACTION
该语句从SalesHistory数据表中删除前面插入的记录。现在我们运行前面运行的同样的SELECT语句。
SELECT COUNT(*) FROM SalesHistory WITH(NOLOCK)
这次返回记录数的值为300。我第一次查询读记录的事务还没有提交,这就是一个脏数据读取。
READPAST
这是一个比NOLOCK较少使用的数据表提示。这个提示指明数据库引擎返回结果时忽略加锁的行或数据页。
这个数据表提示的优点和NOLOCK一样,在处理查询时不会发生阻塞。此外,读脏数据并不会出现在READPASTA中,因为不会返回锁定的记录。这个语句的缺点是,因为不返回锁定的记录,所以很难确定结果集或修改语句是否包含所有必须的记录。在你的应用中可能需要添加一些逻辑来确保最终包含所有必须的记录。
READPAST数据表提示的例子和NOLOCK的例子类似。我将使用一个事务来更新SalesHistory数据表中的一个记录。
BEGIN TRANSACTION
UPDATE TOP(1) SalesHistory
SET SalePrice = SalePrice + 1
因为我没有提交或回滚这个事务,所以添加在更新记录上的锁仍旧有效。在一个新的查询编辑窗口中,运行下面的脚本,该脚本对SalesHistory数据表使用READPAST统计表中的记录数。
SELECT COUNT(*)
FROM SalesHistory WITH(READPAST)
最初SalesHistory数据表中包含300条记录,UPDATE语句正锁定表中一条记录,所以上面使用READPAST的脚本返回结果为299条记录,这说明我要更新的记录被锁定,所以被REASPAST提示忽略。
SQL Server脏读方式数据提取---NOLOCK和READPAST相关推荐
- 如何使用数据质量服务和SQL Server集成服务清除数据
介绍 (Introduction) A year or so ago, I worked for an online web grocery software house located in the ...
- 了解SQL Server数据库静态数据及其如何适合数据库生命周期管理
什么是静态数据 (What is static data) Static data (aka Code, Lookup, List or Reference data), in the context ...
- SQL Server中的数据层应用程序简介
In this article, I'm going to introduce the data-tier applications in SQL Server. As the official do ...
- 在AWS RDS SQL Server中恢复数据
This article explores the process to recover data in AWS RDS SQL Server and its recent enhancements. ...
- sql server 导入excel数据表
sql server 导入excel数据表 之前谈到过在sql server中对用户的购买记录做过关联分析,数据来源是来自sql server数据库,但有的时候,数据源来自于其他文件,比如excel文 ...
- php删除sql server 2008,MSSQL_SQL Server2008 数据库误删除数据的恢复方法分享,SQL Server中误删除数据的恢复本 - phpStudy...
SQL Server2008 数据库误删除数据的恢复方法分享 SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的 ...
- SQL server获取数据库数据
SQL server获取数据库数据 两表对比,查询A表中缺少的字段 例如 获取数据库指定表中的列 例如 获取某个存储过程的参数 两表对比,查询A表中缺少的字段 select a.name as nam ...
- SQL Server插入中文数据后出现乱码
原文:SQL Server插入中文数据后出现乱码 今天在做项目的过程中遇到如标题的问题,情况如下图: 数据库使用的是SQL Server2012版本,创建表的脚本如下: CREATE TABLE [d ...
- SQL Server :理解数据记录结构
原文:SQL Server :理解数据记录结构 在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下 ...
最新文章
- 计算机基础知识教案1,计算机基础知识教案一
- 踩坑记录--VScode编辑不同文件没有及时crtl+s,导致文件修改无效
- MySQL中TEXT数据类型的最大长度___MySQL VARCHAR字段最大长度究竟是多少
- tensorflow出现 ImportError: DLL load failed: 找不到指定的程序
- python调用dos命令_基于Python执行dos命令并获取输出的结果
- docker容器别人访问很卡_一篇文章带你走进Docker的世界
- GoF 的 23 种设计模式
- git小乌龟的安装和使用教程
- 3D视觉从入门到精通知识星球
- 麻省理工十亿美元计算机学院,麻省理工学院宣布10亿美元成立新计算机学院 | 芥末堆...
- 微信小程序语音搜索功能
- 动物生存竞争对投资的启示!
- STM32之RTC实时时钟
- 深入浅出Java反射原理和使用场景
- ajax传递数组怎么传?ajax数组传递
- Windows平台JDK8下载和安装说明
- js中判断字符串是否相等,使用 == 或===
- springboot(九)--统一异常处理(500)、错误页处理(404)
- java 给定价格和付款金额计算找零金额-挖财笔试编程题
- 王半仙儿的日记-0009