SQL2008中SQL应用之-阻塞(Blocking)应用分析
在SQLServer中,一个阻塞的进程会无限期地保持阻塞,或者直到它超时(根据setlock_timeout)、服务器关闭、进程被杀死、连接完成了更新或者其他发生在原始事务上的操作导致它释放了资源上的锁。
发生长时间阻塞的原因如下:
1、在一个没有索引的表上的过量的行锁会导致SQLServer得到一个锁,从而阻塞其他事务。
2、应用程序打开一个事务,并在事务保持打开的时候要求用户进行反馈或交互。这通常是让最终用户在GUI上输入数据而保持事务打开的时候发生。此时,事务引用的任何资源都会被占据。
3、事务BEGIN后查询的数据可能在事务事务开始前被调用
4、查询不恰当地使用锁定提示。例如,应用程序仅使用很少的行,但却使用一个表锁提示
5、应用程序使用长时间运行的事务,在一个事务中更新了很多行或很多表(把一个大量更新的事务变成多个更新较少的事务有助于改善并发性)
下面我们演示使用SQLServer动态管理视图sys.dm_os_waiting_tasks找出阻塞进程,该视图用于代替早期SQLServer版本中的系统存储过程sp_who
找出阻塞的进程后,我们使用sys.dm_exec_sql_text动态管理函数和sys.dm_exec_Connections(DMV)找出正在执行的查询的SQL文本,然后强制结束进程。
强制结束进程,我们使用kill命令。kill的用法,请参看MSDN:http://msdn.microsoft.com/zh-cn/library/ms173730.aspx
该命令有三个参数:
在第一个查询窗口:
BEGINTRAN
UPDATEProduction.ProductInventory
SETQuantity=400
WHEREProductID=1AND
LocationID=1
第二个窗口:
UPDATEProduction.ProductInventory
SETQuantity=406
WHEREProductID=1AND
LocationID=1
第三个窗口:
SELECTblocking_session_id,wait_duration_ms,session_id
FROMsys.dm_os_waiting_tasks
WHEREblocking_session_idISNOTNULL
/*
blocking_session_idwait_duration_mssession_id
522387654
*/
可以看出是SessionID为52的会话阻塞了SessionID为54的会话。
那么,52正在干啥坏事呢?在第三个窗口中执行:
SELECTt.text
FROMsys.dm_exec_connectionsc
CROSSAPPLYsys.dm_exec_sql_text(c.most_recent_sql_handle)t
WHEREc.session_id=54
/*
text
(@1int,@2tinyint,@3tinyint)UPDATE[Production].[ProductInventory]set[Quantity]=@1WHERE
[ProductID]=@2AND[LocationID]=@3
*/
注意:这并不是第一个查询窗口中的原SQL语句,SQLServer进行了自动参数化计划缓存(预编译)。
我们强制终止会话。在第三个窗口中执行:
kill52
注意:窗口一的语句和窗口二的语句均终止。
提示:第三个语句中,使用
参数以毫秒为单位。超过时会返回锁定错误。示例:
在第一个窗口中执行:
USEAdventureWorks
BEGINTRAN
UPDATEProduction.ProductInventory
SETQuantity=400
WHEREProductID=1AND
LocationID=1
在第二个窗口中执行:
USEAdventureWorks
SETLOCK_TIMEOUT1000
UPDATEProduction.ProductInventory
SETQuantity=406
WHEREProductID=1AND
LocationID=1
/*
1秒后的执行结果
Msg1222,Level16,State51,Line3
Lockrequesttimeoutperiodexceeded.
Thestatementhasbeenterminated.
*/
解析:在这个示例中,我们设置了锁超时时间为1000毫秒,即1秒。这个设置不会影响资源被进程占有的时间,只会影响等待另一个进程释放资源访问的时间。
相关文章
- 数据分析sql面试必会6题经典_数据分析师SQL面试必备50题[通俗易懂]
- 模块化开发 Angular 应用 [含懒加载]
- 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )
- C++哈希应用——布隆过滤器
- 谈谈 23 种设计模式在 Android 项目中的应用详解手机开发
- 快速导出Oracle数据库表记录SQL语句大全(oracle导出表数据sql)
- Oracle中使用SQL创建数据表(oracle创建表sql)
- 使用SQL新增MySQL表字段的技巧(mysql新增字段sql语句)
- 快速学会PostgreSQL中导入SQL文件(postgresql导入sql文件)
- tuningMySQL 日志分析指南:SQL 优化最佳实践(mysql日志sql)
- MySQL查找提升系统性能的慢SQL(mysql查看慢sql)
- 研究员利用 Twitter 一应用漏洞将 1700 万个电话号码跟用户账号配对起来
- 使用MySQL执行SQL指令:简单易学的基础教程(mysql运行sql命令)
- sql试用MSSQL空间:体验SQL带来的强大性能(mssql空间试用)
- 深入分析MySQL的SQL语句(mysql分析sql语句)
- 美国微软SQL数据库的优势与应用(美国mssql)
- 程序SQL Server驱动程序:让应用驱动你的数据库(sqlserver的驱动)
- 性能报告Oracle季度SQL性能分析报告(oracle 季度sql)
- MySQL SQL日志技术指南(mysql sql 日志)
- MSSQL如何通过美化格式简化SQL查询(mssql美化格式sql)
- SQLserver如何快速导入SQL文件(sqlserver导入sql文件)
- 掌握SQL语句才能深度应用Oracle(sql语句和oracle)
- azure sql比较分析AWS MySQL 与 Azure SQL的区别(aws mysql 还是)
- 利用Oracle下的SQL挖掘智慧(oracle下的sql)
- Oracle SQL环比分析发掘数据背后的规律(oracle_sql环比)
- Oracle SQL实战从初学者到专家(oracle sql实战)
- Oracle 10g桌面应用解决方案开启新的体验之旅(oracle10g桌面版)
- Sql学习第一天——SQL练习题(建表/sql语句)