SQLServer脏读方式数据怎么提取

58次阅读
没有评论

共计 2002 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章主要介绍“SQLServer 脏读方式数据怎么提取”,在日常操作中,相信很多人在 SQLServer 脏读方式数据怎么提取问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQLServer 脏读方式数据怎么提取”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

在设计数据库应用时,你应该记住各种不同类型的锁及事务发生的不同隔离级别。通常情况下,SQLServer 默认方式能够很好地完成你要使用的功能,不过,有些时候利用 SQL 语句在数据表上手工添加关于锁是如何应用的提示信息将是十分有用的。

本文主要介绍了两种数据表提示:NOLOCK 和 READPAST。我们将建立一个数据表用作例子中的查询数据表。执行列表 A 中的脚本建立一个 SalesHistory 数据表并添加一些数据。

NOLOCK

该数据表提示,也称为 READUNCOMMITTED,只能用于 SELECT 语句。NOLOCK 表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修改。

该语句的好处是它可以使数据库引擎不用在处理查询中的上锁问题,可以提高并发性并改善数据库性能,因为数据库引擎不用在维护共享锁的使用问题。存在的问题是因为该语句不能处理要读取的数据表的所有锁,所以一些“脏数据”或未被提交的数据潜在的可能被读取。

假如某个事务被滚回,那么应用了 NOLOCK 连接的数据读取操作将可以读取未提交的数据。这种类型的读取导致处理的不一致性会带来很多问题。这是你使用 NOLOCK 时应该了解的技巧。

作为一个负面影响,NOLOCK 查询还可能带来读取“幻影”数据或读取在一个数据库读取事务中可以获得的但在另一个事务中可能被滚回的数据的风险。(我将在本系列文章的第二部分对这个负面影响进行详细说明。)

下面的例子展示了 NOLOCK 如何工作以及脏数据读取是如何产生的。在下面的脚本中,我用一个事务在 SalesHistory 数据表中插入一条记录。

SQLServer 脏读方式数据怎么提取之 NOLOCK 和 READPAST

BEGINTRANSACTIONINSERTINTOSalesHistory(Product,SaleDate,SalePrice)VALUES(PoolTable ,GETDATE(),500)

这个事务仍旧是开放的,这意味着仍可以对插入数据表的记录上锁以阻止其它操作。在一个新的查询窗口中,运行下面的脚本,该脚本使用 NOLOCK 数据表提示返回 SalesHistory 数据表中的记录数。

SELECTCOUNT(*)FROMSalesHistoryWITH(NOLOCK)

返回记录数值为 301。因为对 SalesHistory 数据表插入记录的事务还没有提交,所以我们可以撤销它。我通过使用下面的语句将事务滚回:

ROLLBACKTRANSACTION

该语句从 SalesHistory 数据表中删除前面插入的记录。现在我们运行前面运行的同样的 SELECT 语句。

SELECTCOUNT(*)FROMSalesHistoryWITH(NOLOCK)

这次返回记录数的值为 300。我第一次查询读记录的事务还没有提交,这就是一个脏数据读取。

READPAST

这是一个比 NOLOCK 较少使用的数据表提示。这个提示指明数据库引擎返回结果时忽略加锁的行或数据页。

这个数据表提示的优点和 NOLOCK 一样,在处理查询时不会发生阻塞。此外,读脏数据并不会出现在 READPASTA 中,因为不会返回锁定的记录。这个语句的缺点是,因为不返回锁定的记录,所以很难确定结果集或修改语句是否包含所有必须的记录。在你的应用中可能需要添加一些逻辑来确保最终包含所有必须的记录。

READPAST 数据表提示的例子和 NOLOCK 的例子类似。我将使用一个事务来更新 SalesHistory 数据表中的一个记录。

BEGINTRANSACTIONUPDATETOP(1)SalesHistorySETSalePriceSalePrice=SalePrice+1

因为我没有提交或回滚这个事务,所以添加在更新记录上的锁仍旧有效。在一个新的查询编辑窗口中,运行下面的脚本,该脚本对 SalesHistory 数据表使用 READPAST 统计表中的记录数。

SELECTCOUNT(*)FROMSalesHistoryWITH(READPAST)

最初 SalesHistory 数据表中包含 300 条记录,UPDATE 语句正锁定表中一条记录,所以上面使用 READPAST 的脚本返回结果为 299 条记录,这说明我要更新的记录被锁定,所以被 REASPAST 提示忽略。

到此,关于“SQLServer 脏读方式数据怎么提取”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计2002字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)