Sqlserver2008行版本控制解決阻塞
公司有一個跑了N年的OLTP系統,使用的是sqlserver2008資料庫,由於之前運維sqlserver的經驗較少,權當oracle的方式在運維,資料庫本身也並沒做過什麼最佳化,只是給了很大的記憶體;有一次突然使用者反饋系統使用緩慢、卡死,於是先檢視應用伺服器日誌,發現後臺頻繁刷報錯日誌:
死鎖的典型報錯,於是檢視資料庫的阻塞情況,透過sqlserver2008的活動監視器發現,資料庫阻塞嚴重,等待型別均為等待獲取S共享鎖,被阻塞的SQL均為select
於是就奇怪了,查詢為什麼會執行這麼久呢? 根據以往經驗查詢語句不會加鎖,難道是查詢SQL的效能太差了需要最佳化?於是抓取資料庫中執行時間久的SQL,抓到了幾條然後又建了索引,單條SQL跑是挺快的,覺得大功告成了,這時一看資料庫效能資料,發現仍然阻塞嚴重,使用者還是一直叫卡~~~,看來思路錯了,這時繼續在監視器中檢視阻塞最久的會話的阻塞者ID,發現阻塞者居然是update,也就是說update阻塞了select。
發現這個問題以後,於是仔細的學習了下sqlserver有關MVCC和隔離級別相關知識,明白了原來在sqlserver中查詢是需要加共享鎖的,而Update需要獲取排它鎖,併發系統中在同一行記錄會產生鎖衝突,要解決這個問題可以開啟sqlserver的行版本管理,在預設的提交讀隔離級別中設定ALTER DATABASE thoms SET READ_COMMITTED_SNAPSHOT ON,開啟快照讀的功能
如此設定,select就不會被update阻塞了,加入了行版本控制,select可以根據事務ID和每行的頭資訊讀取可見版本,是不是跟oracle的undo有異曲同工之妙哇!~
目前系統已經開啟了READ_COMMITTED_SNAPSHOT引數,資料庫會話阻塞消失,使用者反饋系統使用順暢!
死鎖的典型報錯,於是檢視資料庫的阻塞情況,透過sqlserver2008的活動監視器發現,資料庫阻塞嚴重,等待型別均為等待獲取S共享鎖,被阻塞的SQL均為select
於是就奇怪了,查詢為什麼會執行這麼久呢? 根據以往經驗查詢語句不會加鎖,難道是查詢SQL的效能太差了需要最佳化?於是抓取資料庫中執行時間久的SQL,抓到了幾條然後又建了索引,單條SQL跑是挺快的,覺得大功告成了,這時一看資料庫效能資料,發現仍然阻塞嚴重,使用者還是一直叫卡~~~,看來思路錯了,這時繼續在監視器中檢視阻塞最久的會話的阻塞者ID,發現阻塞者居然是update,也就是說update阻塞了select。
發現這個問題以後,於是仔細的學習了下sqlserver有關MVCC和隔離級別相關知識,明白了原來在sqlserver中查詢是需要加共享鎖的,而Update需要獲取排它鎖,併發系統中在同一行記錄會產生鎖衝突,要解決這個問題可以開啟sqlserver的行版本管理,在預設的提交讀隔離級別中設定ALTER DATABASE thoms SET READ_COMMITTED_SNAPSHOT ON,開啟快照讀的功能
如此設定,select就不會被update阻塞了,加入了行版本控制,select可以根據事務ID和每行的頭資訊讀取可見版本,是不是跟oracle的undo有異曲同工之妙哇!~
目前系統已經開啟了READ_COMMITTED_SNAPSHOT引數,資料庫會話阻塞消失,使用者反饋系統使用順暢!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29018063/viewspace-1975432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決“阻塞效應”-解決指令碼檔案下載阻塞網頁渲染的問題指令碼網頁
- 解決 eclipse cdt 執行時控制檯亂碼解決Eclipse
- Java阻塞佇列執行緒集控制的實現Java佇列執行緒
- 如何使用CVS進行版本控制
- java:錯誤:不支援發行版本1.4解決方案Java
- JDBC無法用SSL連線SqlServer2008的解決方法JDBCSQLServer
- 解決Vue3專案執行控制檯警告Vue
- 版本控制
- jQuery同步Ajax帶來的UI執行緒阻塞問題及解決辦法jQueryUI執行緒
- Linux 如何解決共享庫的版本控制Linux
- SVN 版本衝突解決
- Git版本控制與工作流詳解Git
- PostgreSQL中多版本併發控制詳解SQL
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 內網控制解決方案內網
- 搭建私有git伺服器進行版本控制Git伺服器
- 並行版本控制的好幫手--WinMerge並行
- 執行緒的阻塞執行緒
- 版本控制工具
- rabbitmq解決erlang版本問題MQ
- 手把手教你如何進行 程式碼版本控制
- 使用版本控制來進行翻譯協作
- 使用WinCVS進行版本控制(摘自GRO.net)
- 使用Java和Flyway進行資料庫版本控制Java資料庫
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- (瞭解)rest_framework之版本控制, 響應器, url控制器RESTFramework
- 版本控制常見問題列表——版本控制心得(三) (轉)
- Flutter版本控制fvmFlutter
- 關於版本控制
- Webstorm解除版本控制WebORM
- Git(1) —— 版本控制Git
- 版本控制工具(svn)
- node 多版本控制
- apache版本資訊控制Apache
- 版本控制系統
- layer彈框刪除ztree節點非阻塞問題解決
- HHMySQL?中定位?DDL?被阻塞的問題及解決方案xmwMySql
- 鎖的種類,阻塞,死鎖產生與解決辦法。