天天看點

淺談Mysql原理與優化(五)——并發與鎖

事務

資料庫一個很重要的功能就是事務。

所謂事務一個很簡單的例子就是:現在我要交易給你一百塊錢,這個交易,對于資料庫意味着我的餘額減100,你的餘額加100兩個操作。事務需要保證不管出現任何意外的情況,在其他人看來,這個兩個操作要麼都成功,要麼都失敗。

淺談Mysql原理與優化(五)——并發與鎖

“在其他人看來"這點很重要,因為我們目前會話的資料庫的操作總是有先有後,但是我們要保證對于其同時進行的其他查詢會話的資料一緻性。

那麼如何實作事務呢,一般是通過鎖機制或者并發機制來實作的。

比較簡單的方式是通過鎖來實作的。這個方式就好比告訴其他人“我們兩個在交易過程中,誰也不許看” 隻有等我們交易完了,其他人才能查詢我們的餘額。

淺談Mysql原理與優化(五)——并發與鎖

簡單的概括來說有以下幾個特點

  1. 讀操作和寫操作沖突,不能同時操作,不同會話的讀操作之間不沖突。
  2. 沖突時後面的操作會等待,影響并發性能
  3. update等寫操作會自動加鎖,但是讀操作如果需要限制并發,則需要手動加鎖,有下面兩種。
select… lock in share mode 表鎖
select … for update 行鎖,如果存儲引擎支援的話

這種方式比較簡單粗暴,由于鎖沖突的時候會産生等待,并發性能能會明顯下降。

多版本并發

這是一種更加複雜,但是性能更好的方案。簡單的來說就是“交易過程中其他人可以看,但是看到的是我們交易完成前的錄像”,在資料庫中,其他人查詢并不需要等待,但是查詢到的是事務開始前的快照,

淺談Mysql原理與優化(五)——并發與鎖

這是InnoDB預設使用的方案。寫會産生鎖,但是讀不需要持有鎖,讀寫不沖突,是以并發性能高。

鎖加在哪裡

我們前邊講過,Innodb中,主鍵和資料共同構成表的資料結構,Innodb的鎖是行鎖,主要是加在主鍵記錄上(還有一種間隙鎖會鎖住主鍵的間隙),類似于下圖所示

淺談Mysql原理與優化(五)——并發與鎖

值得注意的是,如果你通過了索引過濾了資料,是會鎖住索引過濾後的主鍵記錄,這并不會鎖住很多資料而影響并發性。

淺談Mysql原理與優化(五)——并發與鎖

但是如果你的語句沒有用到索引,而是使用了一個全表掃描,那很不幸,你所有掃描到的資料都會加鎖,即使你最後隻獲得一條資料。這時候就會很大的影響你系統的并發能力了。

以上就是MySQL的并發與鎖的機制,希望能對大家高并發系統的設計有所幫助。