1.READPAST

  ReadPast会让SQL Server在查询数据时如果遇到数据行被锁定可以跳过继续搜索数据,从而避免了锁定。

2.UPDLOCK

  UPDLOCK会让SQL Server在查询数据时如果找到一条满足条件的数据行就立即将此行数据加锁,从而避免了死锁。

3.NOLOCK

  NOLOCK会让SQL Server在查询数据时,忽略锁的存在而读取数据,同时读取数据也不加锁。

  这在设计分布式系统时尤为重要,在设计分布式系统时我们要考虑的一个方面就是通过牺牲一致性来提高系统的并发性能,首先并不是所有情况下都要求具有很高的一致性,比如有一些提供给管理人员使用的监控系统他对系统的数据一致性和实时性的要求就不是很高,同时合理利用NOLOCK还可以减少死锁的发生机率。

  比如说有一个任务系统有两个并行的流程A和B,系统规定同一个人只能做A,B两个任务中的一个,那这样一个任务系统在申请任务的时候如果不使用NOLOCK的话死锁的几率就会很高,这将在下面举一个简单的示例,此示例仅用来做简单示例。

  在设计基于数据库的任务系统时如果将READPAST、UPDLOCK,NOLOCK结合将会有非常好的效果,假设我们将任务系统实现为一个基于WCF的服务。

  任务系统数据表定义:

    tblTask

      Taskid

     ProcessID

      CreateTime

      Userid

      Status(N New,D Doing,F Finished)

  接口如下:

    ITaskService

      string RequestTask(string userid ,string processID)

      string SubmitTask(string userid ,string processID ,string taskId)

  如果RequestTask的实现采用如下的关键语句的话:

--根据@ProcessID和@UserID来选择满足条件的任务SELECT TOP 1 [TaskID] FROM [dbo].[tblTask] AS A WITH(READPAST,UPDLOCK) WHERE A.[ProcessID] = @ProcessID AND A.[Status] = 'N' AND NOT EXISTS(SELECT TOP 1 1 FROM [dbo].[tblTask] AS B WITH(NOLOCK) WHERE B.[TaskID] = A.[TaskID] AND B.[ProcessID] <> A.[ProcessID] AND B.[UserID] <> @UserID) ORDER BY [CreateDate] DESC

  //更新所选出来的任务

  UPDATE tblTask SET userid= @userid,Status = 'D' WHERE TaskID = @TaskID

  假设有200个客户端同时通过TaskService来申请任务的话,如果我们在SQL利用了READPAST和UPDLOCK那么每个客户端都会在短时间内获取到不同的任务,不会有阻塞,如果没有使用READPAST和UPDLOCK的话那情况就不一样了。

上面使用了两个步骤来选择任务更新任务,因此需要连个数据库通信的开销,如果能利用OUTPUT的功能在一个SQL中执行选择并更新那应该是最好的方案了,具体如下:

DECLARE @UserID VARCHAR(10)='001'
DECLARE @ProcessID INT = 1DECLARE @ReturnTasks TABLE([TaskID] INT NOT NULL,[CreateDate] DATETIME
);UPDATE [dbo].[tblTask] WITH(READPAST,UPDLOCK)
SET [UserID]= @UserID, [Status] = 'D'
OUTPUT DELETED.[TaskID],DELETED.[CreateDate]
INTO @ReturnTasks
FROM (SELECT TOP 2 A.[TaskID]FROM [dbo].[tblTask] AS A  WITH(READPAST,UPDLOCK) WHERE A.[ProcessID] = @ProcessID AND A.[Status] = 'N' AND NOT EXISTS(SELECT * FROM [dbo].[tblTask] AS B WITH(NOLOCK) WHERE B.[TaskID] = A.[TaskID] AND B.[ProcessID] <> A.[ProcessID] AND B.[UserID] <> @UserID) ORDER BY A.[CreateDate] DESC) AS C
WHERE [dbo].[tblTask].[TaskID] = C.[TaskID]SELECT * FROM @ReturnTasks ORDER BY [CreateDate] DESC

转载于:https://www.cnblogs.com/zanxiaofeng/archive/2010/03/07/1680341.html

在基于数据库的任务派发系统中利用SQL Server 2005 中新的查询提示来提高系统的效率...相关推荐

  1. Visual C# 2008+SQL Server 2005 数据库与网络开发--9.1.1 SQL Server 2005中的XML功能

    在SQL Server 2005中,对XML的支持已经集成到数据库本身的所有组件中,主要包括以下几方面. 支持XML格式的数据类型. 可以对XML格式的数据或者变量进行XQuery的查询. 增强了XM ...

  2. 使用 SQL Server 2005中的 CLR 集成

    Balaji Rathakrishnan Christian Kleinerman Brad Richards Ramachandran Venkatesh Vineet Rao Microsoft ...

  3. SQL Server 2005中专用管理员连接 (DAC) 使用技巧修改系统表的方法

    Server 2005 专用管理员连接 (DAC) 使用技巧 1 什么是专用管理员连接? SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用. 2 ...

  4. (转)SQL Server:在 SQL Server 2005 中配置数据库邮件,发送邮件

    SQL Server:在 SQL Server 2005 中配置数据库邮件,发送邮件 [作/译者]:鹏城万里    [日期]:2008-07-24    [来源]:本站原创    [查看]: 2031 ...

  5. 如何在SQL Server 2005中还原数据库

    还原数据库的方式 有几种数据库备份的方式就将会有几种还原数据库的 方式: l 完整备份的还原:无论是完整备份.差异备份还是事务日志备份的还原,在第一步都要先做完整备份的还原.完整备份的还原只需要还原完 ...

  6. 访问MS Access 系统表 MSysObjects ,在SQL SERVER 2005中访问

    首先设置MS Access,给予访问MSysObjects 的权限 1. Open Microsoft Access 2. From the Tools menu, select the Option ...

  7. 如何在SQL Server 2005中修复损坏的数据库

    1. 在SQL Server Management Studio中随便创建一个数据库,例如:PVLink. 2. 停止SQL Server服务. 如果不停止此服务,刚才创建的PVLink数据库将即不能 ...

  8. 如何在sql server 2005 中安装northwind 和 pubs 数据库

    step 1:在微软官方网站下载 SQL2000SampleDb.msi ,去 http://www.microsoft.com/en-us/download/details.aspx?id=2365 ...

  9. Microsoft SQL Server 2005 中安装 Northwind 和 pubs 示例数据库

    step 1: 官方网站链接:http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC ...

最新文章

  1. ./和../和/三种路径的区别
  2. 010-映射诊断环境
  3. spring getbean 方法分析
  4. 【最佳解法】剑指 Offer 25. 合并两个排序的链表
  5. mysql导入数据提前修改字段_Mysql一些导入导出数据库,添加修改字段命令_MySQL...
  6. Android Service+Socket 联网交互
  7. 草稿 12月第2周 排课
  8. JavaWeb——AOP
  9. numpy教程:函数库和ufunc函数
  10. 室内定位发展趋势分析
  11. Python requests练习:爬取猫眼电影排行
  12. 利用python进行TEQC质量检核结果绘图
  13. word树状分支图_word树状图怎么做分支
  14. 29.Go异常处理-recover
  15. D. Berserk And Fireball(Educational Codeforces Round 91 (Rated for Div. 2))
  16. 教你如何搜索百度网盘的资源 百度网盘资源搜索方法!
  17. 怎样学手机拼音打字html t=45,在手机上怎么学拼音打字
  18. 免密登录 蹩脚的“脚本”
  19. python实战|python爬取58同城租房数据并以Excel文件格式保存到本地
  20. 文明重启哪个服务器最多,文明重启攻略 新手快速霸服技巧分享[多图]

热门文章

  1. MYSQL MYSQLI PDO
  2. Spring的事务管理难点剖析(1):DAO和事务管理的牵绊
  3. OFBiz + Opentaps 目录管理 六. 产品目录
  4. Agent监控软件在IT工作中的应用
  5. Ubuntu20.4安装YouCompleteMe
  6. 为传递函数自动设定PID参数——pidtune学习笔记
  7. ROS学习笔记12(用Python写一个简单的消息发布和消息订阅)
  8. Linux中Vim基本用法
  9. python异常的处理机制_python异常和文件处理机制详解
  10. NFT赛车游戏F1® Delta Time启动第二轮2019赛车NFT质押活动