成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server 2008中SQL應用之三“阻塞(Blocking)”

數據庫 SQL Server
當一個數據庫會話中的事務正鎖定一個或多個其他會話事務想要讀取或修改的資源時,會產生阻塞(Blocking)。通常短時間的阻塞沒有問題,且是較忙的應用程序所需要的。然而,設計糟糕的應用程序會導致長時間的阻塞,這就不必要地鎖定了資源,而且阻塞了其他會話讀取和更新它們。

當一個數據庫會話中的事務正鎖定一個或多個其他會話事務想要讀取或修改的資源時,會產生阻塞(Blocking)。通常短時間的阻塞沒有問題,且是較忙的應用程序所需要的。然而,設計糟糕的應用程序會導致長時間的阻塞,這就不必要地鎖定了資源,而且阻塞了其他會話讀取和更新它們。

在SQL Server中,一個阻塞的進程會無限期地保持阻塞,或者直到它超時(根據set lock_timeout)、服務器關閉、進程被殺死、連接完成了更新或者其他發生在原始事務上的操作導致它釋放了資源上的鎖。

發生長時間阻塞的原因如下:

  1. 在一個沒有索引的表上的過量的行鎖會導致SQL Server得到一個鎖,從而阻塞其他事務。
  2. 應用程序打開一個事務,并在事務保持打開的時候要求用戶進行反饋或交互。這通常是讓最終用戶在GUI上輸入數據而保持事務打開的時候發生。此時,事務引用的任何資源都會被占據。
  3. 事務BEGIN后查詢的數據可能在事務事務開始前被調用
  4. 查詢不恰當地使用鎖定提示。例如,應用程序僅使用很少的行,但卻使用一個表鎖提示
  5. 應用程序使用長時間運行的事務,在一個事務中更新了很多行或很多表(把一個大量更新的事務變成多個更新較少的事務有助于改善并發性)

一、找到并解決阻塞進程

下面我們演示使用SQL Server動態管理視圖sys.dm_os_waiting_tasks找出阻塞進程,該視圖用于代替早期SQL Server版本中的系統存儲過程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

該命令有三個參數:

  • session ID    要終止的進程的會話 ID。session ID 是在建立連接時為每個用戶連接分配的***整數 (int)。在連接期間,會話 ID 值與該連接捆綁在一起。連接結束時,則釋放該整數值,并且可以將它重新分配給新的連接。使用 KILL session ID 可終止與指定的會話 ID 關聯的常規非分布式事務和分布式事務。
  • UOW    標識分布式事務的工作單元 (UOW) ID。UOW 是可從 sys.dm_tran_locks 動態管理視圖的 request_owner_guid 列中獲取的 GUID。也可從錯誤日志中或通過 MS DTC 監視器獲取 UOW。有關監視分布式事務的詳細信息,請參閱 MS DTC 文檔。使用 KILL UOW 可終止孤立的分布式事務。這些事務不與任何真實的會話 ID 相關聯,與虛擬的會話 ID = '-2' 相關聯。可使標識孤立事務變得更為簡單,其方法是查詢 sys.dm_tran_locks、sys.dm_exec_sessions 或 sys.dm_exec_requests 動態管理視圖中的會話 ID 列。
  • WITH STATUSONLY    生成由于更早的 KILL 語句而正在回滾的指定 session ID 或 UOW 的進度報告。KILL WITH STATUSONLY 不終止或回滾 session ID 或 UOW,該命令只顯示當前的回滾進度。

在***個查詢窗口:

  1. BEGIN TRAN  
  2. UPDATE Production.ProductInventory  
  3. SET Quantity = 400  
  4. WHERE ProductID = 1 AND 
  5. LocationID = 1 

第二個窗口:

  1. UPDATE Production.ProductInventory  
  2. SET Quantity = 406  
  3. WHERE ProductID = 1 AND 
  4. LocationID = 1 

第三個窗口:

  1. SELECT blocking_session_id, wait_duration_ms, session_id  
  2. FROM sys.dm_os_waiting_tasks  
  3. WHERE blocking_session_id IS NOT NULL 
  4.  
  5. /*blocking_session_id    wait_duration_ms    session_id  
  6.            52                  23876             54  
  7. */ 

可以看出是SessionID為52的會話阻塞了SessionID為54的會話。

那么,52正在干啥壞事呢?在第三個窗口中執行:

  1. SELECT t.text  
  2. FROM sys.dm_exec_connections c  
  3. CROSS APPLY sys.dm_exec_sql_text (c.most_recent_sql_handle) t  
  4. WHERE c.session_id = 54  
  5.  
  6. /*text(@1 int,@2 tinyint,@3 tinyint)  
  7. UPDATE [Production].[ProductInventory] set [Quantity] = @1    
  8. WHERE [ProductID]=@2 AND [LocationID]=@3  
  9. */ 

注意:這并不是***個查詢窗口中的原SQL語句,SQL Server進行了自動參數化計劃緩存(預編譯)。

我們強制終止會話。在第三個窗口中執行:

kill 52 注意:窗口一的語句和窗口二的語句均終止。

提示:第三個語句中,使用sys.dm_exec_connections(DMV)返回了Session ID為53的most_recent_sql_handle列。這是SQL文本在內存中的指針。作為sys.dm_exec_sql_text動態管理函數的輸入參數使用。從sys.dm_exec_sql_text返回了text列,該列顯示了阻塞進程的SQL文本。如果阻塞成串,必須通過blocking_session_id和session_ID列仔細查看每一個阻塞進程,直到發現原始的阻塞進程。

二、配置語句等待鎖釋放的時長

如果有一個事務或語句被阻塞,意味著它在等待資源上的鎖被釋放。我們可以事先通過set lock_Timeout來設定需要等待的時間。

語法如下:SET LOCK_TIMEOUT time_period

參數以毫秒為單位。超過時會返回鎖定錯誤。示例:

在***個窗口中執行:

  1. USE AdventureWorks  
  2. BEGIN TRAN  
  3. UPDATE Production.ProductInventory  
  4. SET Quantity = 400  
  5. WHERE ProductID = 1 AND 
  6. LocationID = 1 

在第二個窗口中執行:

  1. USE AdventureWorks  
  2. SET LOCK_TIMEOUT 1000  
  3. UPDATE Production.ProductInventory  
  4. SET Quantity = 406  
  5. WHERE ProductID = 1 AND 
  6. LocationID = 1  
  7.  
  8. /*1秒后的執行結果Msg 1222, Level 16, State 51,Line 3  
  9. Lock request time out period exceeded.  
  10. The statement has been terminated.  
  11. */ 

解析:在這個示例中,我們設置了鎖超時時間為1000毫秒,即1秒。這個設置不會影響資源被進程占有的時間,只會影響等待另一個進程釋放資源訪問的時間。

原文鏈接:http://www.cnblogs.com/downmoon/archive/2011/02/18/1957913.html

 【編輯推薦】

  1. SQL Server 2008中SQL應用之一“死鎖(Deadlocking)”
  2. SQL Server 2008中SQL應用之二“鎖定(locking)”
  3. 淺析SQL Server 2008中的代碼安全之二:DDL觸發器與登錄觸發器
  4. 淺析SQL Server 2008中的代碼安全之三:通過PassPhrase加密
  5. 淺析SQL Server 2008中的代碼安全之四:主密鑰 

 

責任編輯:艾婧 來源: 博客園
相關推薦

2011-02-18 17:31:18

SQL Server

2011-03-11 10:35:31

SQL鎖定SQL Server

2011-02-28 13:19:50

SQL Server SQL死鎖

2011-08-19 14:38:22

SQL Server 2008遞歸查詢

2011-08-19 14:03:36

SQL Server 檢索集合

2011-08-19 13:46:22

SQL Server 組裝有序集合

2011-03-03 10:45:51

2011-02-21 13:06:42

Microsoft S

2011-09-01 13:24:42

SQL Server 呈現GeoRSS訂閱的Bing Maps

2009-04-16 18:15:19

動作審核審核活動SQL Server

2009-04-16 17:44:31

2009-04-16 17:03:12

報表開發工具報表制作SQL Server

2013-03-13 09:53:50

SQL Server

2011-08-19 10:13:34

SQL Server Values新用途

2011-08-19 10:24:46

SQL Server Top新用途

2011-08-19 11:00:54

SQL Server WaitFor命令

2011-08-19 10:40:27

SQL Server Merge命令

2010-11-12 13:08:36

動態sql語句

2009-04-16 17:55:15

擴展熱插拔SQL Server

2009-05-18 18:20:14

虛擬化Hyper-VWindows ser
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人艳妇aa视频在线 | 高清免费av | 亚洲国产高清在线观看 | 美女爽到呻吟久久久久 | 少妇性l交大片免费一 | 国产色网 | www.一区二区三区 | 干狠狠 | 一区二区三区四区电影视频在线观看 | 日本成人中文字幕 | 男人天堂网址 | 成人免费视频一区二区 | 国产精品国产三级国产aⅴ原创 | 亚洲精品国产电影 | 久久99精品久久久久久噜噜 | 亚洲一区精品在线 | 日本xx视频免费观看 | 91av国产在线视频 | 欧美激情视频一区二区三区在线播放 | 久久国产美女视频 | 亚洲精选一区二区 | 国产黄色大片在线免费观看 | 久久91精品| 一二三四av | 精品综合视频 | 日本三级日产三级国产三级 | 日韩精品一区二区三区高清免费 | 中文一区| 黄网站在线观看 | 美女久久 | 亚洲自拍一区在线观看 | 亚洲欧美中文日韩在线v日本 | 国产在线网站 | 欧美亚洲视频在线观看 | 一级a性色生活片久久毛片 午夜精品在线观看 | 刘亦菲国产毛片bd | 日韩国产中文字幕 | 一级看片免费视频囗交动图 | 一区二区免费高清视频 | 欧美一区二区 | 久久久精品国产 |