什么叫事務隔離級別呢?


那么到底什么是事務隔離級別呢?

這其實也是事務的一大特性有關系,事務的隔離性。

隔離性,就是在多個事務間會出現一個異常情況,那么針對這些異常情況,我們需要有不同的處理結論,但是不同的處理結論肯定導致的性能方面會有不一樣的結果。

 

那么有因必有果,我們先說說,為啥會出現事務隔離級別這個機制。

在業務高並發的情況下,我們系統中業務邏輯使用到了事務處理,那么肯定在短時間內會產生多個事務情況。那么多個事務,就會有一些異常情況發生。按照王哥我的一貫風格,用一個逗比一樣的場景來解讀表達一下。

第一回

在一天風和日麗的下午,太陽如膠似渴,我實在渴的不行,然后看到路邊有好多人圍着一個水果攤,正在那里做橘子買賣交易。

這個時候,我走過去,問老板:這橘子還有多少個啊?還有200個嗎?我得多買一點呢。

老板看到顧客A手上正挑着20個橘子,正准備交錢呢,然后數了數攤上的,一共180,然后告訴我:不好意思啊,只剩下180個橘子了,要不您去別的攤子看看?

我一聽,算了算了,我去別的地方看看吧,都沒200個橘子,不夠買的。

剛走不遠,那攤子老板就在遠處大叫我:小伙子,小伙子!快回來,有200個橘子。

我氣急敗壞的過去說道:你弄啥嘞。干嘛啊。

他趕緊解釋道:剛剛那顧客A,突然有急事,丟下橘子就跑了,錢還沒給我。都怪我,這還沒有完成的交易,我都算進去了,抱歉哈。我不應該臟讀的,讀了為提交的事務了。

 

第二回

那好吧,我為了200個橘子原諒你了,然后我說道:那你趕緊點點數,看看還有多少個橘子,夠200個嗎?

攤子老板認真點了一下,說道:正好,200個,不多不少。

那我要200個!正當我從我的愛馬仕包中拿出一沓紅票子的一系列動作的時候,一個顧客B迅速的拿起30個橘子,快速的和攤子老板完成了交易,就走了,然后我就在付錢的那一刻,說道:老板,你再點點數,一共有多少個橘子,我要付錢了。

攤子老板說到:這不剛點完嗎?200個啊,我再點一下就是了,1、2、....170。誒,怎么就沒有200個了?

我氣急敗壞到:你這不是欺詐嗎?奸商!200個橘子,偷工減料,我都准備給錢了,你給錢前和給錢前前,總數都不一樣!!

 

第三回

這個時候,一個好像是老板親戚的一個男子開着一輛車過來了,拉了一車的水果。

我同老板正在爭論呢,老板,你再給我點點數!到底有種水果。

這個時候,那個男子搬了一箱50個蘋果在攤子上。

老板正點着呢:1、2。誒,!怎么變2種了!怎么有這么多水果了?。

我更火冒三丈了,到底多少,老板,你是不是數學不好!

我來點一遍!

這個時候,那個男子又搬了一箱50個香蕉在攤子上。

我正點着呢:1、2、3。誒!!!!見鬼了啊,大白天的,我出現幻覺了!!。

這個時候,那個男子又搬了一箱50個菠蘿在攤子上。

老板說:我來點一遍!

老板正點着呢:1、2、3、4。誒,!怎么變4了!這怎么又多了。

我來點一遍!

這個時候,那個男子又搬了一箱50個鴨梨在攤子上。

我正點着呢:1、2、3、4、5。誒!!!!見鬼了啊,大白天的,我出現幻覺了!!。

........................

 

 

那么上述的三個現象就是三種高並發情況下出現的三種異常情況。

分別為:

  1. 臟讀:老板把人家還沒有完成的交易就算成了已經完成的交易,還沒有提交的數據都是臟數據。造成了對老板,對我的困擾。
  2. 重復讀:在攤子上面,我叫老板點了攤子的總數兩遍,但是期間有人買了一袋橘子走人,導致兩遍的總數不一樣,導致我要買橘子的這個事務完成不了。出現異常情況。
  3. 幻讀:在我要求下,老板一遍的點水果種類的總數,但是這個時候,那個卸貨的人不停的在對攤子上的水果種類總數進行一個增加,導致我們兩個點數,以為出現了幻覺。

 

那么也不瞎扯了,我們說說專業的描述:

隔離級別:

數據庫系統必須具有隔離並發運行各個事務的能力,是它們之間相互不影響,避免了各種並發問題。一個事務與其他事務隔離的程度為隔離級別。(也就是相互之間影響的影響的程度導致隔離級別,影響程度越小,那么就說明隔離級別越大)。SQL標准中規定了多種事務的隔離級別,不同的隔離級別分別對應着不同的干擾程度,隔離級別越高,數據一致性就越好,但是並發性越弱。

  1. 讀未提交(READ UNCOMMITTED):允許事務A讀取事務B未提交的修改。
  2. 讀已提交(READ COMMITTED):要求事務A只能讀取事務B已經提交的修改。
  3. 可重復讀(REPEATABLE READ):確保事務A可以多次從一個字段中讀取到相同的值,那么就是禁止其他事務在事務A還沒有執行結束期間對這個字段的操作,新。
  4. 串行化(SERIALIZABLE):為了保證事務A可以多次在一個表中讀取到相同的行,在事務A執行期間,禁止其他事務對這個表進行增、刪、改操作。可以避免任何的並發問題,但是性能降低

各個隔離級別解決並發問題的能力如下:

各種數據庫對事務隔離級別的支持程度及默認值:(Oracle、MySQL)

 

 

總結:

最后面關於總結,那么我們肯定要回歸到剛剛的那個場景中去,根據實際的業務場景來講一下實際的應用方法和效果。(默認按可重復讀的配置說明)

第一回:其實已經說到了,就是,叫老板點數的時候,把人家還沒有執行成功的交易不要算進去就可以了,人家還沒有付錢的一切交易都是假的,人家摸摸你的橘子又不賣不行嗎?

第二回:方法就是,那個顧客B就壓根不讓他買就對了,我明明都和老板談好了,要200個橘子,也正好200個橘子,你這個時候還買橘子給別人就不對了,我都在掏錢了,正完成交易了,再着急也得我這單完成在說。所以就是,我買東西的時候,老板不要和其他人說買東西的事情,這個時候被我和老板、橘子這三個東西上鎖了。

第三回:我和老板正在數水果的種類的時候,你一個送貨的不停的在對攤上的水果種類變化,我們怎么數,怎么確定?這個時候,使用可重復讀的事務隔離級別是沒有用的,必須配置串行化,要控制這個整個攤子上的水果的變化,也就是說我在買水果,可能買任何一種水果,這個時候,我點數,你別人都沒辦法對這個攤上的水果進行一個變更(讀應該是可以的)。

 

那么最高隔離級別:串行化到底怎么理解呢?串行化也可認為為持久化。就是當所有的數據沒有落地穩定,寫入硬盤中,都不能讀取,操作。除非沒人訪問了,你就可以操作了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM