sql數(shù)據(jù)庫為什么會(huì)經(jīng)常鎖表?
網(wǎng)友解答: 真相只有一個(gè)!你的設(shè)計(jì)太水了。。我在有一個(gè)問題《數(shù)據(jù)庫什么時(shí)候會(huì)死鎖》的回答中提到了,數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性,防止并發(fā)對(duì)數(shù)據(jù)正確性的影響,通常會(huì)使用加鎖的方式!而一共有表
真相只有一個(gè)!你的設(shè)計(jì)太水了。。
我在有一個(gè)問題《數(shù)據(jù)庫什么時(shí)候會(huì)死鎖》的回答中提到了,數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性,防止并發(fā)對(duì)數(shù)據(jù)正確性的影響,通常會(huì)使用加鎖的方式!
而一共有表級(jí)鎖,行級(jí)鎖和頁面鎖三種鎖粒度,鎖又有共享鎖(通常用于讀數(shù)據(jù))和獨(dú)占鎖(通常用于寫數(shù)據(jù))等的區(qū)分!
關(guān)于數(shù)據(jù)庫鎖機(jī)制發(fā)生死鎖的原因,請(qǐng)參考我的那篇回答,回到這個(gè)提問上來,為什么數(shù)據(jù)庫經(jīng)常鎖表?
鎖表的意思很明顯,就是表數(shù)據(jù)被鎖,導(dǎo)致其他事務(wù)訪問不到表中的數(shù)據(jù)!可能原因有哪些呢?
1,字段不加索引:在執(zhí)行事務(wù)的時(shí)候,如果表中沒有索引,會(huì)執(zhí)行全表掃描,如果這時(shí)候有其他的事務(wù)過來,就會(huì)發(fā)生鎖表!
2,事務(wù)處理時(shí)間長:事務(wù)處理時(shí)間較長,當(dāng)越來越多事務(wù)堆積的時(shí)候,會(huì)發(fā)生鎖表!
3,關(guān)聯(lián)操作太多:涉及到很多張表的修改等,在并發(fā)量大的時(shí)候,會(huì)造成大量表數(shù)據(jù)被鎖!
出現(xiàn)鎖表應(yīng)該怎么解決呢?
1,通過相關(guān)的sql語句可以查出是否被鎖定,和被鎖定的數(shù)據(jù)!
2,為加鎖進(jìn)行時(shí)間限定,防止無限死鎖!
3,加索引,避免全表掃描!
4,盡量順序操作數(shù)據(jù)!
5,根據(jù)引擎選擇合理的鎖粒度!
6,事務(wù)中的處理時(shí)間盡量短!
生產(chǎn)中出現(xiàn)死鎖等問題是比較嚴(yán)重的問題,因?yàn)橥ǔK梨i沒有明顯的錯(cuò)誤日志,只有在發(fā)現(xiàn)錯(cuò)誤的時(shí)候才能后知后覺的處理,所以,一定要盡力避免!
由于篇幅原因,就不再贅述,改天再寫下數(shù)據(jù)庫鎖的機(jī)制和死鎖原因和解決方案,敬請(qǐng)關(guān)注。。