MySQL鎖相關內容

2021-10-02 23:39:22 字數 1889 閱讀 8500

mysql的表鎖使用 lock table 表名 (read | write),...,語句來新增讀鎖或者寫鎖。通過unlock table;語句來釋放所有表鎖。在對錶加了表鎖時,這個連線就不能再操作其他表了(包括讀和寫)。簡而言之,就是讀鎖會阻塞寫,但是不會阻塞讀。而寫鎖則會把讀和寫都阻塞。

還有一點就是網上都說表鎖不會造成死鎖。我一直對此感到疑惑,我就想乙個連線鎖了乙個表,然後另乙個連線鎖了另乙個表。接著這兩個連線再分別去鎖對方已經鎖定的表,那不就造成死鎖了嗎?但是,通過我自己的實驗發現,原來在乙個連線已經鎖了表的情況下,再去鎖其他的表,會把之前的表鎖先釋放掉,再去鎖新的表。也就是說,乙個連線去鎖新的表的時候,它一定不占有任何表,這樣就杜絕了死鎖。這才是表鎖不會造成死鎖的真正原因。

innodb引擎預設在乙個事務中使用行鎖,但是當那個表沒有對應索引或者索引失效時,就會從行鎖公升級為表鎖,導致併發度大幅降低。innodb的查詢都是有事務的,預設是autocommit=1,也就是每一條sql語句作為乙個事務。    

併發一致性會導致如下三個問題:

髒讀:事務1修改乙個資料,事務2接著讀取到了這個修改後的資料。但是如果之後事務1撤銷了修改,那麼事務2讀到的資料就是錯誤的,髒的資料。

不可重複讀:事務2讀取了乙個資料,接著事務1對這個資料進行了修改,事務1提交後,事務2再讀這個資料,就會得到與之前不同的結果。

幻影讀:事務2統計乙個表的行數,接著事務1往這個表插入資料,事務1提交後,事務2再次統計這個表的行數,就會得到與之前不同的結果。

mysql提供了四種隔離級別:

未提交讀(read uncommitted):事務中的修改,即使沒有提交,對其它事務也是可見的。這個級別沒有解決任何的問題。

提交讀(read committed):乙個事務只能讀取已經提交的事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。這個級別解決了髒讀。

可重複讀(repeatable read):保證在同乙個事務中多次讀取同一資料的結果是一樣的。要提交了之後,才能讀取到其他事務修改的內容。這個級別解決了髒讀和不可重複讀。

可序列化(serializable):強制事務序列執行,這樣多個事務互不干擾,不會出現併發一致性問題。通過使用加鎖機制,確保同一時間只有乙個事務執行。這個級別最嚴格,解決了髒讀、不可重複讀和幻影讀。

mysql的預設隔離級別是可重複讀。一般來說,隔離級別越低,支援的併發度就越高,但是併發一致性問題就越嚴重。總之要在業務需求和效能之間進行權衡,來確定mysql所使用的隔離級別。

行鎖優化建議:

盡可能讓所有資料檢索都通過索引來完成,避免無索引行鎖公升級為表鎖。

合理設計索引,盡量縮小鎖的範圍。

盡可能較少檢索條件,避免間隙鎖。

盡量控制事務大小,減少鎖定資源量和時間長度。

盡可能低級別事務隔離。(因為越高階別的事務隔離,併發度越低,效能也就越低)

在資料庫中,併發控制是指在多個使用者/程序/執行緒同時對資料庫進行操作時,如何保證事務的一致性和隔離性的,同時最大程度地併發。

當多個使用者/程序/執行緒同時對資料庫進行操作時,會出現3種衝突情形:

讀-讀,不存在任何問題

讀-寫,有隔離性問題,可能遇到髒讀(會讀到未提交的資料) ,幻影讀等。

寫-寫,可能丟失更新

對於,樂觀鎖、悲觀鎖,這兩種只是一種用鎖的思想,不是具體的鎖。樂觀鎖就是併發控制時不用鎖,悲觀鎖就是併發控制時都用鎖。樂觀鎖是無鎖地解決 寫-寫併發控制問題,悲觀鎖是有鎖地解決 讀-寫和寫-寫併發控制問題。

注意,所謂的mvcc和樂觀鎖、悲觀鎖沒有關係。mvcc是為了解決悲觀鎖處理 讀-寫併發控制問題過慢而提出來的,是一種用來解決 讀-寫併發控制 的無鎖併發控制。(其實,我覺得還是樂觀鎖思想的一種延續啊。。。) 

而至於 寫-寫併發控制問題怎麼解決,可以用樂觀鎖或者悲觀鎖。具體用哪個,完全取決於專案的具體業務需求。

InnoDB儲存引擎的鎖相關內容

innodb儲存引擎實現了如下兩種標準的行級鎖 如果乙個事務t1已經獲取行r的共享鎖,那麼另外的事務t2可以立即獲得行r的共享鎖,因為讀取並沒有改變行r的資料,這種情況稱為鎖相容 lock compatible 但是若有其他的事務t3想獲得行r的排他鎖,則必須等待事務t1 t2釋放行r上面的共享鎖,...

MySQL索引相關內容

mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構。可以得到索引的本質 索引是資料結構。索引的優勢 1 類似大學圖書館建書目索引,提高資料檢索的效率,降低資料庫的io成本 2 通過索引列對資料進行排序,降低資料排序的成本,降低了cpu的消耗。索引的劣勢 1 雖然索...

ORACLE相關內容

1 em,dbca,netca,netmgr出現亂碼方案 cd oracle home jre lib mv font.properties font.properties.bak mv font.properties.zh font.properties em,dbca,netca,netmgr詳...