天天看點

MySQL第33課~并發和鎖定Concurrency and Locking

作者:小餅幹筆記

所有内容收錄在合集~MySQL入門到熟練。歡迎點贊關注我哦~

之前的32節課程,我們都是模拟的自己和自己玩的場景,是唯一的使用者。實際的工作中,不會确定有幾個人一起同時通路資料。這就是

并發 Concurrency

一個使用者在搜尋問題時,修改資料時,其他人可能也在。。。

并發是個問題,試試将他最小化。

先從2個人開始,假設小一和小二,都想給資料做調整,可能是金額,積分,或者随便什麼

第一步,建立2個伺服器連接配接,沒錯,就是上方那個Local instance

現在我建立了2個了,獨立的連接配接。

MySQL第33課~并發和鎖定Concurrency and Locking

然後就用顧客積分,五一到了,我一激動想給第一個人送200積分,先寫一串,然後不執行,直接複制到另一個伺服器

然後執行的時候會發現,不能同時,第一個完成才能執行第二個

MySQL第33課~并發和鎖定Concurrency and Locking

這個時候不用擔心反複添加,再反複添加,讓積分一下暴富,瞬間增加超多的積分

正常情況下,前後執行,得到不同的積分結果,從2273變為2873

MySQL第33課~并發和鎖定Concurrency and Locking

但是,俗話說的好,不出意外的話,就要出意外了。意外有以下幾種:

1 丢失更新 Lost Updates

如果事務之間沖突,且沒有上鎖時,就會發生這種情況。較晚送出的資料會覆寫前面的資料,導緻資料奇怪,也就是确實了一部分資料。

假設兩個資料都想修改資料,一個增加資料,一個想更改電話号碼或者位址,同時發生,為了避免出意外,MySQL會使用鎖,進而避免同時更改,出現錯誤。

2 髒讀 Dirty Reads

一個事務讀了尚未被送出的資料,比如有人修改了一筆訂單,但是還沒送出更新,另外一個人也讀取了資料,并且進行了調整。經過一系列操作,最後導緻錯誤結果。

這個時候可以建立隔離。

有4個事務隔離級别,比如READ COMMITTED 事務隻能讀取已送出的資料。

如果事務完成之後資料有修改,則不會有影響。重要的是讀到的任何資料,在讀取的時候都是已經送出的資料。

3 不可重複讀 Non Repeating Reads

讀取了資料2次,結果不一樣,,,

一次看到顧客的客單價是999,然後這個時候,客單價更新了,不管是多少,

第二次讀的時候就不一樣,那麼這個時候不可重複讀或者不一緻讀,會有效果。

當然一般預設根據最新資訊做決定。畢竟時間早的話,業務部門的資料也是一直改變的。

4 幻讀 phantom reads

比如想給達成一定金額的人一個積分返利,這期間也有其他的成交金額達到了這個值,但是沒有查詢傳回,就遺漏了這部分人。

這就是幻取,導緻一部分人變成了幽靈人。這個時候需要用序清單來解決問題。對應的條件是,擁有的客戶和并發的事務越多,需要的時間越長。

總結:

隔離級别會損害性能和可拓展性,是以,隻有在有必要防止幻讀的情況下才可以使用這個

一次說這些很抽象,後面的課程會具體展開。

繼續閱讀