sql數據庫為什麼會經常鎖表?

李原草

真相只有一個!你的設計太水了。。

我在有一個問題《數據庫什麼時候會死鎖》的回答中提到了,數據庫為了保證數據的一致性,防止併發對數據正確性的影響,通常會使用加鎖的方式!

而一共有表級鎖,行級鎖和頁面鎖三種鎖粒度,鎖又有共享鎖(通常用於讀數據)和獨佔鎖(通常用於寫數據)等的區分!


關於數據庫鎖機制發生死鎖的原因,請參考我的那篇回答,回到這個提問上來,為什麼數據庫經常鎖表?

鎖表的意思很明顯,就是表數據被鎖,導致其他事務訪問不到表中的數據!可能原因有哪些呢?

1,字段不加索引:在執行事務的時候,如果表中沒有索引,會執行全表掃描,如果這時候有其他的事務過來,就會發生鎖表!

2,事務處理時間長:事務處理時間較長,當越來越多事務堆積的時候,會發生鎖表!

3,關聯操作太多:涉及到很多張表的修改等,在併發量大的時候,會造成大量表數據被鎖!


出現鎖表應該怎麼解決呢?

1,通過相關的sql語句可以查出是否被鎖定,和被鎖定的數據!

2,為加鎖進行時間限定,防止無限死鎖!

3,加索引,避免全表掃描!

4,儘量順序操作數據!

5,根據引擎選擇合理的鎖粒度!

6,事務中的處理時間儘量短!

生產中出現死鎖等問題是比較嚴重的問題,因為通常死鎖沒有明顯的錯誤日誌,只有在發現錯誤的時候才能後知後覺的處理,所以,一定要盡力避免!


由於篇幅原因,就不再贅述,改天再寫下數據庫鎖的機制和死鎖原因和解決方案,敬請關注。。


分享到:


相關文章: