SqlServer中如何解決session阻塞問題
簡(jiǎn)介
對(duì)于數(shù)據(jù)庫運(yùn)維人員來說創(chuàng)建session或者查詢時(shí)產(chǎn)生問題是常規(guī)情況,下面介紹一種很有效且不借助第三方工具的方式來解決類似問題。
最近開始接觸運(yùn)維工作,所以自己總結(jié)一些方案便于不懂?dāng)?shù)據(jù)庫的同事解決一些不太緊要的數(shù)據(jù)庫問題。類似方法很多理論也很多,我就不做深究,就是簡(jiǎn)單寫一個(gè)方案,便于菜鳥使用的。
阻塞理解
在Sql Server 中當(dāng)一個(gè)數(shù)據(jù)庫會(huì)話中的事務(wù)正鎖定一個(gè)或多個(gè)其他會(huì)話事務(wù)想要讀取或修改的資源時(shí),會(huì)產(chǎn)生阻塞(Blocking)。通常短時(shí)間的阻塞沒有問題,且是較忙的應(yīng)用程序所需要的。然而,設(shè)計(jì)糟糕的應(yīng)用程序會(huì)導(dǎo)致長(zhǎng)時(shí)間的阻塞,這就不必要地鎖定了資源,而且阻塞了其他會(huì)話讀取和更新它們。
例子
為了更好說明,下面用一個(gè)例子來介紹。創(chuàng)建一個(gè)表并插入數(shù)據(jù),然后創(chuàng)建不同的session,同事阻塞session。具體的代碼截圖如下:
1.創(chuàng)建表Employee
2.插入測(cè)試數(shù)據(jù)
現(xiàn)在我們有了測(cè)試表,表中有12條數(shù)據(jù),打開另一個(gè)查詢對(duì)話框在SSMS中(意味著重新創(chuàng)建了一個(gè)session)
3.在新的查詢窗口中首先要開啟事務(wù),然后寫一個(gè)插入語句
在這個(gè)地方,我們能看到開啟了一個(gè)事務(wù)。但是沒有end tran 來終止事務(wù),因此事務(wù)狀態(tài)為“open”,現(xiàn)在運(yùn)行腳本來看一下當(dāng)前看起的運(yùn)行處于“open”狀態(tài)的session。
現(xiàn)在能夠看到如上圖展示一樣,運(yùn)行的查詢正在open狀態(tài)的session。我們執(zhí)行了這個(gè)命令但是沒有完結(jié)它,DBA會(huì)聯(lián)系這個(gè)session的創(chuàng)建者來完成事務(wù),或者回滾事務(wù)。
現(xiàn)在讓我們創(chuàng)建另一個(gè)session,更新一條記錄并且不提交,即讓查詢session的狀態(tài)為“open”。因此在新的查詢窗口中 寫一個(gè)語句來執(zhí)行如下:
這里會(huì)看到系統(tǒng)正在運(yùn)行后沒有完成語句的狀態(tài)(因?yàn)樯弦粋€(gè)事務(wù)沒有關(guān)閉導(dǎo)致表鎖,這個(gè)不能插入),現(xiàn)在可以在另外的窗口查詢一下阻塞的情況,如下檢查阻塞的session。
如上所示,阻塞的session ID是58,由于我們更新查詢導(dǎo)致阻塞了54的執(zhí)行,54就是我們插入數(shù)據(jù)未提交的批處理。
現(xiàn)在我們能搞清楚阻塞的原因,也就可以從容解決阻塞了。
解決
方案1
在了解業(yè)務(wù)的情況下,可以直接使用kill session ID的語句來終止某個(gè)阻塞的session。
方案2
在執(zhí)行的事務(wù)的起始加入“set lock_timeout 1000” 語句,這表示如果阻塞超過1000毫秒,這個(gè)請(qǐng)求將被終止。
方案3
回滾或者提交事務(wù)。這個(gè)就不細(xì)說了。
下面是所有語句的代碼:
/****Creating dummy table Employee ****/ CREATE TABLE Employee ( Empid int NOT NULL, Name nchar(10) NULL, City nchar(10) NULL ) ON [PRIMARY] GO /**** Insert dummy data in Employee table *****/ Insert into Employee Values(1245,'George','Jax'), (1045,'Peter','Anadale'), (1157,'John','Dallas'), (1175,'Pete','Topeka'), (875,'Petron','Vienna'), (2311,'Kohli','Mumbai'), (1547,'Peter','Kansas'), (3514,'Abian','KHI'), (4251,'Ghani','Alexandria'), (957,'Ahmed','Vienna'), (1084,'Bhanu','Manderin'), (2954,'Ganeshan','Mcclean') /***** Insert query in new session ****/ BEGIN TRAN Insert into Employee Values(1245,'George','Jax') /**** Query to check currently running sessions ****/ SELECT DISTINCT name AS database_name, session_id, host_name, login_time, login_name, reads, writes FROM sys.dm_exec_sessions LEFT OUTER JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id INNER JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id WHERE resource_type <> 'DATABASE' --AND name ='specific db name' ORDER BY name /**** update query in new session ****/ update Employee set name = 'SHERAZ' where empid = 1245 /**** Query to check blocking queries with session id ****/ SELECT session_id, blocking_session_id, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle); /*** Command if you want to kill blocking session ****/ kill (54)
總結(jié)
自己也使用過多種不同的語句來查詢定位阻塞甚至死鎖,然后解決,這里也是介紹一種臨時(shí)解決方式。萬變不離其宗,歸根結(jié)底還是因?yàn)榇a甚至數(shù)據(jù)庫設(shè)計(jì)上存在很多問題才導(dǎo)致的阻塞,比如缺失索引、事務(wù)中的查詢性能和邏輯順序存在問題、T-SQL語句性能引起的等等不一而足。對(duì)于一些常年解決類似問題的DBA人員來說沒啥價(jià)值,但是對(duì)于不太理解數(shù)據(jù)庫的人來說還是能暫時(shí)解決一些緊急問題,當(dāng)然最后還是要把理論基礎(chǔ)打好才能盡可能的杜絕類似情況。
以上所述是小編給大家介紹的SqlServer中如何解決session阻塞問題,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- mysql的udf編程之非阻塞超時(shí)重傳
- sql server 2000阻塞和死鎖問題的查看與解決方法
- SQL Server誤區(qū)30日談 第2天 DBCC CHECKDB會(huì)導(dǎo)致阻塞
- 利用sys.sysprocesses檢查SqlServer的阻塞和死鎖
- SQL2008中SQL應(yīng)用之-阻塞(Blocking)應(yīng)用分析
- sqlserver中幾種典型的等待
- SQL語句實(shí)現(xiàn)查詢當(dāng)前數(shù)據(jù)庫IO等待狀況
- SQL語句練習(xí)實(shí)例之三——平均銷售等待時(shí)間
- 系統(tǒng)隱形殺手——阻塞與等待(SQL)
相關(guān)文章
sqlserver 觸發(fā)器學(xué)習(xí)(實(shí)現(xiàn)自動(dòng)編號(hào))
前段時(shí)間需要用觸發(fā)器做個(gè)實(shí)現(xiàn)數(shù)據(jù)插入表時(shí)自動(dòng)編號(hào)的功能,于是再學(xué)習(xí)下觸發(fā)器,硬件備份共享于此,以供討論,以免遺忘2012-08-08如何恢復(fù)數(shù)據(jù)庫備份到一個(gè)已存在的正在使用的數(shù)據(jù)庫上
如何恢復(fù)數(shù)據(jù)庫備份到一個(gè)已存在的正在使用的數(shù)據(jù)庫上...2007-01-01存儲(chǔ)過程配合UpdateDaset方法批量插入Dataset數(shù)據(jù)實(shí)現(xiàn)代碼
用存儲(chǔ)過程配合UpdateDaset方法批量插入Dataset數(shù)據(jù),感興趣的你可不要錯(cuò)過了哈,希望本文提供知識(shí)點(diǎn)可以幫助到你2013-02-02如何創(chuàng)建SQL Server 2000故障轉(zhuǎn)移群集
如何創(chuàng)建SQL Server 2000故障轉(zhuǎn)移群集...2007-01-01Sql Server數(shù)據(jù)把列根據(jù)指定內(nèi)容拆分?jǐn)?shù)據(jù)的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Sql Server數(shù)據(jù)把列根據(jù)指定內(nèi)容拆分?jǐn)?shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Sql Server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06用sql實(shí)現(xiàn)18位身份證校驗(yàn)代碼分享 身份證校驗(yàn)位計(jì)算
這篇文章主要介紹了用SQL寫的18位身份證校驗(yàn)代碼,大家參考使用吧2014-01-01編寫SQL需要注意的細(xì)節(jié)Checklist總結(jié)
本周技術(shù)研究部(TRD)的一名DBA 對(duì)我們編寫SQL時(shí)的一些問題,進(jìn)行了匯報(bào)講演,以下是來自它的腳本,我在它講演的基礎(chǔ)上寫出了自己想表述的,以便于大家相互交流學(xué)習(xí)2012-08-08SqlServer服務(wù)中利用觸發(fā)器對(duì)指定賬戶進(jìn)行登錄ip限制提升安全性操作
這篇文章主要介紹了SqlServer服務(wù)中利用觸發(fā)器對(duì)指定賬戶進(jìn)行登錄ip限制提升安全性,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02