當資料庫有併發事務的時候,可能會產生資料不一致,這時候需要一些機制來保證訪問次序,鎖機制就是這樣的乙個機制。
在readuncommitted級別下,讀取資料不需要加共享鎖,這樣就不會和被修改的資料上的排他鎖衝突。
在readcommitted級別下,讀操作需要加共享鎖,但是在語句執行完之後釋放共享鎖。
在repeatableread級別下,讀操作需要加共享鎖,但是在事務提交之前並不釋放共享鎖,即在事務執行完畢以後才釋放共享鎖。
serializable是限制性最強的隔離級別,因為該級別鎖定整個範圍的鍵,並一直持有鎖,直到事務完成。
在關係型資料庫中可以按照鎖的粒度把資料庫鎖分為行級鎖(innodb引擎)、表級鎖(myisam引擎)和頁級鎖(bdb引擎)。
行級鎖是mysql中鎖定粒度最細的一種鎖,只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突,加鎖粒度最小,單加鎖的開銷也最大。行級鎖分為共享鎖和排他鎖。
特點:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度最高。
表級鎖是mysql中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖。實現簡單,資源消耗較少,被大部分mysql引擎支援。最常使用的myisam和innodb都支援表級鎖定。表級鎖分為表共享鎖(共享鎖)和表獨佔寫鎖(排他鎖)。
特點:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發出鎖衝突的概率最高,併發度低。
頁級鎖是mysql中鎖定粒度介於行鎖和表鎖中間的一種鎖。表鎖速度快但衝突多,行鎖衝突少但速度慢,所以取了折中的頁級,一次鎖定相鄰的一組記錄。
特點:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般。
表鎖:開銷小、加鎖快、不會出現死鎖、鎖粒度較大、發生鎖衝突的概率比較大。
行鎖:開銷大、加鎖慢、會出現死鎖、鎖粒度較小、發生鎖衝突的概率較小。
頁鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般。
從鎖的類別上來講,有共享鎖和排他鎖。
共享鎖,又叫做讀鎖。當使用者要進行資料的讀取時,對資料加上共享鎖。共享鎖可以同時加上多個。
排他鎖就叫做寫鎖。當使用者要進行資料的寫入時對資料加上排他鎖,排他鎖只可以加乙個,和其他的共享鎖、排他鎖都相斥。
innodb是基於索引來完成行鎖
例如select * from tab_with_index where id = 1 for update;
for tpdate可以根據條件來完成行鎖鎖定,並且id是有索引鍵的列,如果id不是索引鍵,那麼innodb將完成表鎖。
record lock:單個行記錄上的鎖
gap lock:間隙鎖,鎖定乙個範圍,不包括記錄本身。
next-key lock:record+gap鎖定乙個範圍,包含記錄本身。
innodb對於行的查詢使用next-key lock。
next-locking keying為了解決phantom problem幻讀問題。
當查詢的索引含有唯一屬性時,將next-key lock降級為record key。
gap鎖設計的目的是為了阻止多個事務將記錄插入到同一範圍內,這會導致幻讀問題的產生。
有兩種方式顯式關閉gap鎖:除了外來鍵約束和唯一性檢查外,其餘情況僅使用record lock
a、將事務隔離級別設定為rc。
b、將引數innodb_locks_unsafe_for_binlog設定為1。
死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方的資源,從而導致惡性迴圈的現象。
如果不同程式會併發訪問多個表,盡量約定以相同的順序訪問表,可以大大降低死鎖機會。
在同乙個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖產生概率。
對於非常容易產生死鎖的業務部分,可以嘗試使用公升級鎖定粒度,通過表級鎖來減少死鎖產生的概率。
如果業務處理不好,可以使用分布式事務鎖或者樂觀鎖。
資料庫管理系統(dbms)中的併發控制的任務是,確保在多個事務同時訪問資料庫中同一資料時,不破壞事務的隔離性和統一性以及資料庫的統一性。樂觀鎖和悲觀鎖是兩種主要的技術手段。
實現方式:使用資料庫中的鎖機制。
實現方式:一般使用版本號控制或者cas演算法實現。
樂觀鎖適用於寫比較少的情況下(多讀場景)。即衝突真的很少發生的時候,這樣可以省去鎖的開銷,加大系統的吞吐量。
但如果是多寫的情況,一般會經常產生衝突,這樣會導致上層應用會不斷的進行retry,這樣反而降低效能,所以在多寫的場景下使用悲觀鎖比較合適。
mysql資料庫鎖 MySQL資料庫的鎖機制
在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...
mysql資料庫鎖
表鎖 讀鎖會阻塞寫,但是不會阻塞讀操作。而寫鎖則會把讀和寫都阻塞 myisam索引結構 myisam索引用的b tree來儲存資料,myisam索引的指標指向的是鍵值的位址,位址儲存的是資料。b tree的資料域儲存的內容為實際資料的位址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實...
MySQL資料庫鎖
mysql鎖分為表級鎖 頁級鎖和行級鎖。innodb 行級鎖 在特殊情況下會公升級為表級鎖,如給沒有加索引的非唯一字段加鎖,或者在普通索引中,使用模糊查詢使索引失效,導致加鎖時,公升級為表鎖 myisam 表級鎖 排他鎖又稱為寫鎖,乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖,也修...