mysql 鎖機制(一)

2022-03-02 03:12:36 字數 2056 閱讀 9622

介紹mysql 鎖的機制。

鎖型別讀鎖,是一種共享鎖,s鎖,允許乙個事務是讀取一行,阻止其他事務獲取相同的資料集的排他鎖。

假如事務a對資料項z進行s鎖,那麼事務b只能新增s鎖,而不能新增互斥鎖,也就是x鎖。這保證了,其他事務可以讀取z,

但是在a的s鎖釋放之前,是不能進行任何修改的。

寫鎖,是互斥鎖的一種,x鎖。允許獲取排它鎖的事務更新資料,阻止其他事務取得相同的資料及共享讀鎖和排它寫鎖。

也就是說,加入事務a對資料項z加了寫鎖,那麼會產生乙個效果,那就是其他事務就不能對該資料加任何鎖了,這個時候

a可以對資料項z進行讀取和修改。

鎖物件這裡介紹鎖物件。

表鎖:一次性對一張表整體加鎖,是mysql中最大顆粒度的鎖定機制。

mylsam 儲存引擎就是使用表鎖,開銷小、實現邏輯非常簡單,帶來的系統負面影響小,加鎖和釋放鎖快,無死鎖,但是鎖範圍大,容易發生鎖衝突,併發最低。

行鎖:一次性對一條資料加鎖,鎖定物件的顆粒度小。也就是我們常用的innodb可以用到行鎖,開銷大,加鎖慢,容易出現死鎖;鎖的範圍較小,不易發生鎖衝突,併發高。

頁面鎖:鎖定顆粒介於表鎖和行鎖之間;開銷和加鎖時間介於表鎖和行鎖之間。會出現死鎖;併發度一般。

具體使用哪種引擎,哪種級別的鎖,還是要看業務的,一般來說需要高併發的一般都是用innodb。

innodb

事務為什麼提及到這個innodb東西呢?是因為,俺只用到這東西,其他只是在理解層面上。

innodb 在鎖的概念上兩個特徵,乙個是支援事務,第二個就是行鎖。

為什麼說出這兩個特徵,前面提及過乙個問題,就是說行鎖有幾個問題,開銷發,加鎖慢,容易出現死鎖。

這裡再次介紹事務的acid。

原子性(actomicity),事務是乙個操作單元對資料修改要不全部執行,要不就是全不執行。

一致性(consistent),在事務開始和完成的時候,資料必須保持一致狀態。

隔離性(lsolation),資料庫系統提供一定的隔離機制,保證事務在不受外部併發影響的獨立環境執行。

永續性(durable),事務完成之後,他對於資料的修改是永久性的,即使出現系統故障也能夠保持。

同樣的,因為事務需要保持著這幾種特性,才能說是乙個合格的事務。

因為事務的併發,然後又是行鎖,那麼就會產生一系列併發問題。

假設在不採用鎖措施的情況下:

1.髒讀:乙個事務正在對一條資料做修改,在這個事務提交前。這時候另外乙個事務也用來讀取該條資料,這個時候就是讀取了未提交的資料了。

2.不可重複讀:乙個事務在讀取某些資料已經發生了改變,或某些記錄已經被刪除了。其實就是兩次讀取不一致。

是這樣的,事務可以看成一系列事件的執行,比如說事件a進行讀取資料z,然後其他事務對資料z進行寫操作,那麼a後面乙個事件b也是讀取操作,這個時候b讀取到的資料和a讀取到的資料不一致。

所以這個就叫做不可重複讀,其實就是事務的隔離性被破壞。

幻讀:乙個事務兩次的查詢條件重新讀取以前的資料已經發生數量的改變。比如說同乙個事務t, a事件 讀取到的資料是10條,然後事務b進行了增加一條,那麼問題來了,事務b執行相同條件的查詢的時候就出現了問題。

更新丟失:這個很好理解了,如果理解了髒讀的話,這個就更好理解了,是這樣子的,如果兩個事務,同時對一條資料進行修改,然後分不同時候提交,那麼肯定有乙個是沒有儲存。

事務隔離

通過事務的隔離,來解決一些問題,但是呢,也要權衡利弊,為啥這麼說呢?加鎖肯定降低效能的。

1.讀未提交:

就是不加鎖,上面的問題就是因為不加鎖導致的,所以說,you know。

2.讀已提交

就是說事務只能讀取到其他事務提交後的東西,寫鎖。

這個東西可以解決髒讀,為什麼這麼說呢?因為髒讀不就是讀取沒有提交的資料。

但是不可重複讀還是會發生,是這樣的,不可重複讀是因為乙個事務的事件中間穿插了其他事務的寫事件。

3.可重複讀

事務不會讀到其他事務對已有資料的修改,及時其他事務已提交,也就是說,事務開始時讀到的已有資料是什麼,在事務提交前的任意時刻,這些資料的值都是一樣的。

幻讀問題依然存在。

4.序列化

這個不併發自然不產生問題。

該節為簡單介紹,後續為悲觀和樂觀鎖。

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql 鎖機制一

鎖機制是資料庫系統區別於檔案系統的乙個關鍵特性,他可以確保使用者能以一致的方式讀取和修改資料。為了保證一致性,必須有鎖的介入。mysql操作緩衝池中的lru列表,刪除 新增 移動lru列表中的元素等地方也都適用鎖,從而允許對多種不同資源的併發訪問。打個比方,我們到 上買一件商品,商品只有一件庫存,這...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...