讲解设计应用程序时避免阻塞的八个准则
作者:安娜 发布时间:2009-01-04 14:16:00
当来自应用程序的第一个连接控制锁而第二个连接需要相冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,而在第一个连接上阻塞。不管是来自同一应用程序还是另外一台客户机上单独的应用程序,一个连接都可以阻塞另一个连接。
说明一些需要锁保护的操作可能不明显,例如系统目录表和索引上的锁。
大多数阻塞问题的发生是因为一个进程控制锁的时间过长,导致阻塞的进程链都在其它进程上等待锁。
常见的阻塞情形包括:
◆提交执行时间长的查询。
长时间运行的查询会阻塞其它查询。例如,影响很多行的 DELETE 或 UPDATE 操作能获取很多锁,这些锁不论是否升级到表锁都阻塞其它查询。因此,一般不要将长时间运行的决策支持查询和联机事务处理 (OLTP) 查询混在一起。解决方案是想办法优化查询,如更改索引、将大的复杂查询分成简单的查询或在空闲时间或单独的计算机上运行查询。
查询运行时间长并由此导致阻塞的一个原因是这些查询不适当地使用游标。游标可能是在结果集中浏览的便利方法,但使用游标可能比使用面向集合的查询慢。
◆取消没有提交或回滚的查询。
如果应用程序取消查询(如使用开放式数据库连接 (ODBC) sqlcancel 函数)但没有同时发出所需数目的 ROLLBACK 和 COMMIT 语句,则会发生这种情况。取消查询并不自动回滚或提交事务。取消查询后,所有在事务内获取的锁都将保留。应用程序必须提交或回滚已取消的事务,从而正确地管理事务嵌套级。
◆应用程序没处理完所有结果。
将查询发送到服务器后,所有应用程序必须立即完成提取所有结果行。如果应用程序没有提取所有结果行,锁可能会留在表上而阻塞其他用户。如果使用的应用程序将 Transact-SQL 语句透明地提交给服务器,则该应用程序必须提取所有结果行。如果应用程序没这样做(如果无法配置它执行此操作),则可能无法解决阻塞问题。为避免此问题,可以将这些应用程序限制在报表或决策支持数据库上。
◆分布式客户端/服务器死锁。
与常规死锁不同,分布式死锁无法由 Microsoft? SQL Server? 2000 自动检测到。如果应用程序打开多个与 SQL Server 的连接并异步提交查询,则可能会发生分布式客户端/服务器死锁。
例如,一个客户端应用程序线程有两个开放式连接。该线程异步启动事务并在第一个连接上发出查询。应用程序随后启动其它事务,在另一个连接上发出查询并等待结果。当 SQL Server 返回其中一个连接的结果时,应用程序开始处理这些结果。应用程序就这样处理结果,直到生成结果的查询被另一个连接上执行的查询阻塞而导致再没有可用的结果为止。此时第一个连接阻塞,无限期等待处理更多的结果。第二个连接没有在锁上阻塞,但仍试图将结果返回给应用程序。然而,由于应用程序阻塞而在第一个连接上等待结果,第二个连接的结果将得不到处理。
若要避免此问题,请执行下列任一操作:
●对每个查询使用查询超时。
●对每个查询使用锁定超时。
●使用绑定连接。
猜你喜欢
- 写在前面ufunc是universal function的缩写,意思是这些函数能够作用于narray对象的每一个元素上,而不是针对narra
- 下面就是今天下午的研究成果。发布系统需要响应用户的中断请求,需要在GET方法中杀掉由subprocess派生的子进程,刚开始直接用os.ki
- FCKeditor至今已经到了2.3.1版本了,对于国内的WEB开发者来说,也基本上都已经“闻风知多少”了,很多人将其融放到自己的项目中,更
- 简单了解多子图学习matplotlib的时候,有人肯定会觉得为啥不用Excel,为啥不用origin,为啥不直接使用软件,其实matplot
- 在Python中的while或者for循环之后还可以有else子句,作用是for循环中if条件一直不满足,则最后就执行else语句。for
- 前言很久以前的博客才发现,发布一下。这个系列以后有时间再做。arp攻击arp路由链表,感兴趣的自行百度,我的博客我的笔记.路由指向介绍两个东
- 本文实例为大家分享了tkinter+pygame+spider实现音乐播放器,供大家参考,具体内容如下1.确定页面SongSheet&nbs
- 本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下:这里主要测试在Python中
- 集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而
- 导语在CSDN学习的过程中,遇到了爆火的文章是关于刮刮卡的!大家猜猜看是谁写的?我看这文章都特别火,我也感觉挺好玩的,那就寻思用 Pytho
- 今天,在项目中遇到一个问题,两个js页面要共享一个就js对象。js全局变量和静态变量都不行,其他苦逼的小农们就不要去强求了。而LZ又不想用c
- 1、TransBigData简介TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。TransBigDa
- 有些朋友看到这个标题可能会有疑问,难道在视图中使用*符号还有何要注意的地方吗?对于这个问题,我们先不必回答,先看一下例子吧。 我这里,使用的
- 1、使用函数DATE_SUBDATE_SUB函数在当前时间减去一定的时间DATE_SUB(date,INTERVAL expr unit)d
- 本文是对pandas官方网站上《10Minutes to pandas》的一个简单的翻译,原文在这里。这篇文章是对pandas的一个简单的介
- 简述由于某些原因,在使用 import 时,Python 找不到相应的模块。这时,解释器就会发牢骚 - ImportError。那么,Pyt
- 雅虎的BrowserPlus在曝光了N久后终于发布了,一款类似于Google Gears的浏览器增强插件。在支持的操作系统方面,Gears明
- 一、requests库requests是使用Apache2 licensed 许可证的HTTP库。比urllib模块更简洁。Request支
- <? //以树型结构列出指定目录里的所有文件,如果你想知道自己某个目录里有哪些子目录和文件,可以调用这个类来查看,很方便的。 &nbs
- 自上一篇文章 Z Story : Using Django with GAE Python 后台抓取多个网站的页面全文 后,大体的进度如下: