(1)MySQL之併發控制與事務

2021-10-12 16:27:13 字數 1571 閱讀 2323

同一時刻多個使用者併發讀取資料不會存在什麼問題,因為讀取不會修改資料,但是如果乙個使用者正在讀取某個資料,而另乙個使用者又在修改這個資料,就會產生不確定的結果,這就涉及到併發控制。

在處理併發讀的或者寫時,可以通過實現乙個由兩種型別的鎖組成的鎖系統來解決,這兩種型別的鎖通常就被稱為共享鎖和排他鎖,又叫做讀鎖和寫鎖。其中,讀鎖是共享的,多個使用者可以在同一時刻讀取同乙個資源而互不干擾,寫鎖則是排他的,也就是說乙個寫鎖會阻塞其他的寫鎖和讀鎖,只有這樣才能確保在給定時間裡,只有乙個使用者能夠執行寫入,並防止其他使用者讀取正在寫入的同一資源。

為了提高共享資源的併發性操作,應該盡量只鎖定需要修改的部分資料。任何時候,在給定的資源上,鎖定的資料量越少,則系統的併發程度越高,只要相互之間不發生衝突即可。但加鎖也需要消耗資源,比如獲得鎖、檢查鎖是否解除等,如果系統花費大量時間來管理鎖而不是訪問資料,那麼系統的效能可能因此受到影響,這就需要在鎖開銷和資料安全之間尋求乙個平衡,即鎖策略。mysql提供了多種鎖策略選擇,每種mysql儲存引擎都可以實現自己的鎖策略和鎖的粒度,其中兩種最重要的鎖策略是表鎖(table lock)行級鎖(row lock),其中表鎖是mysql中最基本的鎖策略,並且是開銷最小的鎖策略,它會鎖定整張表;而行級鎖可以最大程度地支援併發處理(同時也帶來了最大的開銷)。

在sql標準中定義了四種隔離級別,每一種級別都規定了乙個事務中所做的修改,哪些在事務內和事務間是可見的,哪些是不可見的,較低階別的隔離通常可以執行更高的併發,系統的開銷也更低。下面介紹四種隔離級別。

①未提交讀

在未提交讀級別,事務中的修改,即使還未提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀。從效能上來說,未提交讀不會比其他的級別好太多,但是卻會缺乏其他級別的很多好處,在實際中很少使用該隔離級別。

②提交讀

大多數資料庫的預設隔離級別都是提交讀,乙個事務開始時只能「看見」已經提交的事務所做的修改,這個級別有時也叫做不可重複讀。所謂不可重複讀就是在a事務兩次讀取資料之間,b事務對資料進行了修改並且提交了,然後a事務第二次讀取到的資料就是b事務修改之後的資料,導致a事務第一次和第二次讀取到的資料不一致。

③可重複讀

可重複讀是mysql的預設事務隔離級別,該級別保證了在同乙個事務中多次讀取到的結果是一致的,但是還是存在幻讀的問題,所謂幻讀就是乙個事務(t1)讀取了幾行資料,接著另乙個併發事務(t2)插入了一些資料,在隨後的查詢中,第乙個事務(t1)就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣。

④可序列化

該隔離級別是最高的隔離級別,通過強制事務序列執行,避免了前面的幻讀問題。

隔離級別

髒讀不可重複讀

幻讀未提交讀

yesyes

yes提交讀

noyes

yes可重複讀

nono

yes可序列化

nono

no

mysql優化(1) mysql事務

事務是mysql等關係型資料庫區別於nosql的重要方面 隨著發展nosql資料庫也開始有了事物的概念 是保證資料一致性的重要手段。本文將首先介紹mysql事務相關的基礎概念,然後介紹事務的acid特性,並分析其實現原理。事務由乙個或多個sql語句組成乙個整體,如果所有的語句執行成功那麼修改將會全部...

事務與併發控制

所謂事務是使用者定義的乙個資料操作序列,這些操作可作為乙個完整的工作單元,要麼全部執行,要麼全部不執行,是乙個不可分割的工作單位.事務中的操作一般是對資料的更新操作,包括增,刪,改.事務的特徵 原子性 atomicity 一致性 consistency 隔離性 isolation 持續性 durab...

事務的併發控制(1)

每個時刻只有乙個事務執行,其他事務必須等到這個事務結束後才執行,當多個使用者併發訪問資料庫時就會產生多個事務同時訪問同一資料的情況。事務時併發控制的基本單位。事務併發操作帶來的資料不一致性包括 丟失資料,不可重複讀結果,讀取髒資料。1 丟失資料 lost update 兩個事務讀入同一資料並修改,t...