資料庫的鎖

2021-07-16 03:16:41 字數 1218 閱讀 9618

相當好的文章!希望以後結合實踐再好好理解。

innodb中的事務隔離級別和鎖的關係

[mysql faq]系列 — 如何檢視當前最新事務id

mysql 對於千萬級的大表要怎麼優化?

鎖有悲觀鎖和樂觀鎖。

悲觀鎖中分共享鎖和排他鎖。在事務中,讀資料的時候加分享鎖(其他事務還可以加分享鎖,但是不能加排他鎖),寫資料的時候加排他鎖(其他事務不能加任何鎖)。

1.read uncommitted 不加任何鎖。

2.read commited 資料讀取不加鎖,資料插入、修改、刪除加鎖。

- 事務a讀第一次,事務b修改資料,事務a再讀,會讀到修改後的值。這是因為讀沒加鎖。

3.repeatable read 資料讀取和寫入都加鎖。但是仍然無法處理插入新資料的問題,因為沒法鎖住新插入的資料。

- 事務a讀第一次,事務b修改資料,事務a再讀,還是讀到原來第一次讀到的值,因此叫可重複讀。這是因為給讀加了鎖。

但其實!

mysql、oracle、postgresql等成熟的資料庫,出於效能考慮,都是使用了以樂觀鎖為理論基礎的mvcc(多版本併發控制)

樂觀鎖,大多是基於資料版本( version )記錄機制實現。

在innodb中,會在每行資料後新增兩個額外的隱藏的值來實現mvcc,這兩個值乙個記錄這行資料何時被建立,另外乙個記錄這行資料何時過期(或者被刪除)。 在實際操作中,儲存的並不是時間,而是事務的版本號,每開啟乙個新事務,事務的版本號就會遞增。 在可重讀repeatable reads事務隔離級別下:

通過mvcc,雖然每行記錄都需要額外的儲存空間,更多的行檢查工作以及一些額外的維護工作,但可以減少鎖的使用,大多數讀操作都不用加鎖,讀資料操作很簡單,效能很好,並且也能保證只會讀取到符合標準的行,也只鎖住必要行。

我們不管從資料庫方面的教課書中學到,還是從網路上看到,大都是上文中事務的四種隔離級別這一模組列出的意思,rr級別是可重複讀的,但無法解決幻讀,而只有在serializable級別才能解決幻讀。於是我就加了乙個事務c來展示效果。在事務c中新增了一條teacher_id=1的資料commit,rr級別中應該會有幻讀現象,事務a在查詢teacher_id=1的資料時會讀到事務c新加的資料。但是測試後發現,在mysql中是不存在這種情況的,在事務c提交後,事務a還是不會讀到這條資料。可見在mysql的rr級別中,是解決了幻讀的讀問題的。

最後innodb的mvcc中還使用了gap鎖,來避免幻讀。

資料庫的鎖

innodb 除了支援行級鎖,還支援由 mysql 服務層實現的表級鎖 lock tables write在指定的表加上表級排他鎖 當這兩種鎖同時存在時,可能導致衝突。例如,事務 a 獲取了表中一行資料的讀鎖 然後事務 b 申請該錶的寫鎖 例如修改表的結構 如果事務 b 加鎖成功,那麼它就應該能修改...

資料庫的鎖

鎖是用於管理對共享資源的併發訪問,是資料庫系統區別於檔案系統的乙個關鍵特性 本文主要來談innodb引擎,innodb引擎支援行鎖 表鎖粒度的鎖 為了支援多粒度鎖定,innodb 儲存引擎引入了意向鎖 intention lock 意向鎖是表級鎖 什麼是意向鎖呢?如果沒有意向鎖,當已經有人使用行鎖對...

資料庫的鎖

資料庫的鎖用來鎖住資料庫中的某些資料,使得當前只能有乙個使用者 會話可以更新資料。所以,資料庫的鎖用來防止同時有乙個或多個使用者更新同一塊資料。當資料被鎖起來,這意味著另乙個資料庫會話在鎖釋放之前不能更新這塊被鎖起來的資料。畫重點 假如會話a嘗試訪問被會話b鎖起來的資料,會話a會發生什麼?會話a會被...