回覆列表
-
1 # 此生唯一
-
2 # 網路圈
對於開發運維和DBA而言,資料庫鎖表現象並不陌生。當遇到鎖表時並沒有什麼好辦法,只能多做檢查,當然了這種檢查也不是漫無目的的檢查。
資料庫為什麼要鎖表?我們知道,資料庫會涉及到多人讀取和寫入,資料庫為了保證ACID特性(原子性、一致性、隔離性、永續性)會對資料做相應保護措施(鎖表)。通俗來說就是,為了防止在資料變更時別人也在同時變更,就需要把表先鎖住不讓別人修改,等資料修改完畢後再釋放鎖。
長時間鎖表容易導致死鎖如果某個表長時間處於鎖定狀態,那可能是競爭資源引起了程序死鎖(即:多個程序互相在等待對方釋放鎖)。導致資料庫長時間鎖定/死鎖表的可能因素主要有:
1、事務處理時間較長,在併發較大情況下容易導致死鎖;
2、表未加索引導致全表掃描,耗時較久;
3、多個程序間存在迴圈等待條件,每個都佔用對方申請的下一個資源。
如何定位被鎖住的表?不同資料庫定位鎖表的方法不盡相同,此處以SQL Server為例看看如何定位被鎖的表。SQL Server可透過SQL Server Profiler檢測工具來查詢,步聚如下:
真相只有一個!你的設計太水了。。
我在有一個問題《資料庫什麼時候會死鎖》的回答中提到了,資料庫為了保證資料的一致性,防止併發對資料正確性的影響,通常會使用加鎖的方式!
而一共有表級鎖,行級鎖和頁面鎖三種鎖粒度,鎖又有共享鎖(通常用於讀資料)和獨佔鎖(通常用於寫資料)等的區分!
關於資料庫鎖機制發生死鎖的原因,請參考我的那篇回答,回到這個提問上來,為什麼資料庫經常鎖表?
鎖表的意思很明顯,就是表資料被鎖,導致其他事務訪問不到表中的資料!可能原因有哪些呢?
1,欄位不加索引:在執行事務的時候,如果表中沒有索引,會執行全表掃描,如果這時候有其他的事務過來,就會發生鎖表!
2,事務處理時間長:事務處理時間較長,當越來越多事務堆積的時候,會發生鎖表!
3,關聯操作太多:涉及到很多張表的修改等,在併發量大的時候,會造成大量表資料被鎖!
出現鎖表應該怎麼解決呢?
1,透過相關的sql語句可以查出是否被鎖定,和被鎖定的資料!
2,為加鎖進行時間限定,防止無限死鎖!
3,加索引,避免全表掃描!
4,儘量順序操作資料!
5,根據引擎選擇合理的鎖粒度!
6,事務中的處理時間儘量短!
生產中出現死鎖等問題是比較嚴重的問題,因為通常死鎖沒有明顯的錯誤日誌,只有在發現錯誤的時候才能後知後覺的處理,所以,一定要盡力避免!
由於篇幅原因,就不再贅述,改天再寫下資料庫鎖的機制和死鎖原因和解決方案,敬請關注。。