所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 
处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST的一些技术知识点: 
对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问题。 
NOLOCK 和 READPAST 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。但是这时候一定要注意NOLOCK 和 READPAST的局限性,确认你的业务逻辑可以容忍这些记录的出现或者不出现: 
简单来说:

NOLOCK 可能把没有提交事务的数据也显示出来. 
READPAST 会把被锁住的行不显示出来

不使用 NOLOCK 和 READPAST ,在 Select 操作时候则有可能报错误:事务(进程 ID **)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。

下面就来演示这个情况。 
为了演示两个事务死锁的情况,我们下面的测试都需要在SQL Server Management Studio中打开两个查询窗口。保证事务不被干扰。

演示一 没有提交的事务,NOLOCK 和 READPAST处理的策略: 
查询窗口一请执行如下脚本:

CREATE TABLE t1 (c1 int IDENTITY(1,1), c2 int) 
go

BEGIN TRANSACTION 
insert t1(c2) values(1)

在查询窗口一执行后,查询窗口二执行如下脚本:

select count(*) from t1 WITH(NOLOCK) 
select count(*) from t1 WITH(READPAST)

结果与分析:

查询窗口二依次显示统计结果为: 1、0 
查询窗口一的命令没有提交事务,所以 READPAST 不会计算没有提交事务的这一条记录,这一条被锁住了,READPAST 看不到;而NOLOCK则可以看到被锁住的这一条记录。

如果这时候我们在查询窗口二中执行:

select count(*) from t1 就会看到这个执行很久不能执行完毕,因为这个查询遇到了一个死锁。

清除掉这个测试环境,需要在查询窗口一中再执行如下语句:

ROLLBACK TRANSACTION 
drop table t1

演示二:对被锁住的记录,NOLOCK 和 READPAST处理的策略

这个演示同样需要两个查询窗口。 
请在查询窗口一中执行如下语句:

CREATE TABLE t2 (UserID int , NickName nvarchar(50)) 
go 
insert t2(UserID,NickName) values(1,'郭红俊') 
insert t2(UserID,NickName) values(2,'蝈蝈俊') 
go

BEGIN TRANSACTION 
update t2 set NickName = '蝈蝈俊.net' where UserID = 2

请在查询窗口二中执行如下脚本:

select * from t2 WITH(NOLOCK) where UserID = 2 
select * from t2 WITH(READPAST) where UserID = 2

结果与分析:

查询窗口二中, NOLOCK 对应的查询结果中我们看到了修改后的记录,READPAST对应的查询结果中我们没有看到任何一条记录。 这种情况下就可能发生脏读

清除测试环境方法参看演示一。

开发实例:

Code
public static string getUserNameByUserIDs(string UserID,string split)
       {
           UserID = "'" + UserID.Replace(split, "'" + split + "'") + "'";
           string sql = "select * from _user with(nolock) where userid in(" + UserID + ")";
           DataSet ds = Framework.IDE.DB.ExecuteDataSet(CommandType.Text, sql);
           string userNames = string.Empty;
           for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
               if (i == 0)
                {
                   userNames = ds.Tables[0].Rows[i]["username"].ToString();
               }
                else
                {
                   userNames += split + ds.Tables[0].Rows[i]["username"].ToString();
               }
            }
           return userNames;
       }

转载于:https://www.cnblogs.com/qanholas/p/3474411.html

SQL with(unlock)与with(readpast) (转)相关推荐

  1. SQL with(unlock)与with(readpast)

    所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...

  2. 第八十一章 SQL命令 UNLOCK

    文章目录 第八十一章 SQL命令 UNLOCK 大纲 参数 描述 权限 Nonexistent Table 示例 第八十一章 SQL命令 UNLOCK 解锁表 大纲 UNLOCK [TABLE] ta ...

  3. 数据库高手(DBA专家 ,SSIS,replacation ,tourble shooting)

    http://www.cnblogs.com/qanholas/category/266780.html 随笔分类 - mssql SQL Server 2008 Datetime Cast 成 Da ...

  4. mysql设置slave复制_mysql5.5建立主从复制(setupmaster-slavereplication)_MySQL

    bitsCN.com mysql5.5建立主从复制(set up master-slave replication) 1.注意事项: (1)主从服务器版本要一致 (2)要修改root密码,切不可用初始 ...

  5. Mysql实战:主从同步

    在两台机器上安装MySQL.主机地址分别为: Master:192.168.11.104 Slave:192.168.11.103 启动mysql服务:/etc/init.d/mysql  start ...

  6. mysql 锁怎么使用_Mysql锁一般使用

    一些很小的项目一般不会特意使用或注意数据锁,其实在事务操作修改与删除时就已经有隐式加锁.一般所有涉及到共享数据都会考虑下数据的原始性问题,保证数据在使用或修改时原始性没有被破坏就需要锁定数据所有权:除 ...

  7. mysql dump 表数据 shell 脚本

    user@ubuntu:~$ cat mysql_jd_espc_dump.sh ## 这段语句为导出语句mysqldump -uroot -ppassword espc --ignore-table ...

  8. mysql主从配置 热备_MYSQL 主从热备方式配置

    MySQL数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题.还好MySQL数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中.实现MySQL数据库的热备 ...

  9. mysql fulsh_mysql之备份和恢复(msyqldump、LVM、xtrabackup)

    备份类型: 根据备份时是服务器是否在线: 热备份(HOT): 读写操作不受影响 温备份(WARM): 进可以执行读操作,写操作不能执行 冷备份(COLD): 读写操作均不能进行 根据备份时对数据文件的 ...

最新文章

  1. 如何在谷歌云平台上部署可解释性模型
  2. 你应该知道的25道Javascript面试题
  3. systemverilog队列
  4. spring用的很开心的标签(随时增加)
  5. 揭秘一份集团公司的三方数据对接情况
  6. 大楼通信综合布线系统_建筑智能化,智能大楼防雷系统设计在综合布线中的重要性...
  7. mysql索引超出了数组接线_索引超出数组范围是什么意思
  8. 解决智慧树考试酷无法复制粘粘的问题
  9. 【Godot】拖放的逻辑
  10. 基于单片机的温度监测系统设计(#0411)
  11. 【Python PE解析器】——制作解析PE文件软件 并进行编译EXE程序 并打包为单个安装程序(全程详细包资料)
  12. 2022年字节跳动日常实习面经(抖音)
  13. Win7常见问题和技巧整
  14. “管中窥豹”,MyCAT的基因缺陷
  15. 2023年全国最新工会考试精选真题及答案37
  16. “禁止燃放烟花爆竹”社会治理创新活动
  17. 浅谈solrCloud的分布式设计
  18. 抖音创意拍摄玩法让你轻松上热门,抖音分身特效教程。
  19. 人们为什么把电子计算机叫电脑,《计算机王国》.pdf
  20. 【机器学习】缺失值的处理方法总结

热门文章

  1. 关于如何在github上创建团队开发环境
  2. Visual Studio 2010 将网站直接发布到远程站点
  3. oracle 无法解析指定的连接标识符
  4. ExtJS 4.1有什么值得期待?
  5. 在Word中插入条形码又一法
  6. 【转载】Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
  7. Python3网络爬虫——(4)urllib.error异常处理
  8. 快速建立自己的个人网站!五款建站程序
  9. 关于linux LVM
  10. 你为什么需要在64位系统下用32位程序