千家信息网

SQLServer脏读方式数据怎么提取

发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,这篇文章主要介绍"SQLServer脏读方式数据怎么提取",在日常操作中,相信很多人在SQLServer脏读方式数据怎么提取问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2024年09月25日SQLServer脏读方式数据怎么提取

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

  在设计数据库应用时,你应该记住各种不同类型的锁及事务发生的不同隔离级别。通常情况下,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脏读方式数据怎么提取"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 数据表 事务 语句 提示 脚本 查询 方式 数据库 问题 面的 例子 处理 学习 应用 运行 引擎 结果 更新 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法律体系 服务器和普通电脑 刀片服务器怎么查mac地址 汽车软件开发学什么语言 涉疫系统网络安全备案情况说明 网络安全论文 文库 正数网络技术有限公司 联系人 网络安全 安全上网手抄报 郑州大学网络技术是大专吗 中国移动网络服务器是什么 塔城新华互联网科技什么专业 阿原网络技术服务部 厦门人工智能应用服务软件开发 软件开发公司硬件联动 北京智能软件开发供应商 直播服务器装机 提高网络安全意识做守法公民 央广网网络安全宣传周 学习计算机网络技术感受 qnx系统软件开发 国家网络安全产业园座谈会 小型网络安全架构设计与实现 网络安全为主题演讲 青海省公安厅网络安全 翔龙互娱网络技术有限公司 橙大业网络技术有限公司 中学生与网络安全教育教案 我国网络技术发展成就 网络技术相关的英语词汇 联通网络技术岗位自我介绍
0