事務&事務的隔離級別

  • 什么是事務?

事務(Transaction):是訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)。
例如:在關系數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。

  • 事務的四大屬性(ACID)

事務具有四個屬性,也是我們常說的ACID

原子性(Atomicity):一個事務是一個不可分割的工作單位,事務中包括的諸操作要么都做,要么都不做。

簡單來說就是把一些操作封裝成一個整體,整體操作要么完成,要么整體內部一個都不做。

一致性(Consistency):事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。

簡單來說就是對存到數據庫的合法性進行校驗,對于合法的數據都應該能夠存到數據庫中,對于不合法的數據都不應該存入數據庫中。

譬如:
一個User表,里面存放userName、age、address等字段
這時對于任意一個滿足User表字段的數據都應該能夠正確存入
如果此時有一個Course對象,里面存放courseName、courseTime、courseScore等字段,把這個Course對象存到剛剛的User表中,很顯然是錯誤的

隔離性(Isolation):一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對并發的其他事務是隔離的,并發執行的各個事務之間不能互相干擾。

簡單理解就是處理數據庫的并發操作,譬如,對于同一條數據此時有兩個數據庫請求同時訪問,一個是查詢,一個是更新,這個時候怎么保證數據的正確性就是由隔離性決定的。

持久性(Durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

簡單來說,就是數據可以永久存儲。

  • 事務的隔離級別

上面說到了隔離性,隔離性的存在就是為了處理數據庫并發訪問帶來的數據安全性和正確性的問題,下面我們詳細說明:

1. read uncommitted(讀取未提交的事務)

字面意思就是讀取未提交,什么意思?

比如:  
一個人在銀行有2000元,這時候另一個人轉賬給他,但是轉賬過程中發現錢出錯了,又撤銷了轉賬,而此時這個人又恰恰在撤銷轉賬之前查詢了賬戶余額,此時如果是`read uncommitted`級別,那么此時查詢的結果就是2000元+轉賬的金額,而事實上這個人賬戶還是2000元。

這就是明顯的臟數據問題,因為轉賬的事務動作還未最終完成,而當前這個人就能查詢到未提交的事務過程。(轉賬和撤銷轉賬是在同一個事務中)

2. read committed(讀取提交的事務)

這個時候我們修改隔離級別,改為讀取提交的事務級別,此時會怎么樣?

比如:
還是這個人有2000元,這個時候他自己在查詢賬戶余額,而此時又有一個人給他轉賬,轉賬過程可能還存在撤銷轉賬操作,但是由于是讀取提交的事務,在轉賬事務未提交之前,他始終讀取的都是原數據庫中的數據,2000元不變,只有當轉賬事務完成提交后,他讀取的才是轉賬后的數額。

3. repeatable read(重復讀取)

解決了臟數據的問題后還是存在另一個問題

比如:
一個事務中有兩次讀取同一條數據的操作,而另一個事務中則是對這條數據進行更新,這就會導致第一個事務第一次讀取時1,此時另一個事務執行提交將數據更新為2,那么第一個事務第二次讀取就是2,明細第一個事務的兩次對同一條數據的讀取是不正確的,即同一事物中對同一條數據的讀取是不重復的。

于是有了repeatable read的隔離級別,它保證多個事務對同一條數據進行操作時,如果有讀取操作,那么就不允許事務對其進行更新操作。

比如:
A事務現在讀取數據庫,B事務有兩步:一是讀取,二是更新,然而發現A事務正在讀取數據,此時B事務只能讀取數據,不能執行對A讀的數據的更新操作。

4. Serializable(序列化)

到了第三個級別repeatable read就沒有問題了嗎?

如果A事務讀取數據庫,此時B事務有兩個操作:讀取之后更新,B事務發現A事務正在讀取。于是只能讀取,此時恰恰A事務執行完成,B事務的讀取也剛好完成,B事務發現已經沒有事務對數據進行讀操作了,這個時候就對數據進行了更新操作,之后A事務再回來查詢數據時發現數據又已經發生了改變,這就是常說的幻讀。

為了解決幻讀的可能,我們將數據庫的隔離級別提高到serializable,它將所有的事務都進行序列化,進行了排隊處理,每次只接受一個事務請求,只有一個事務結束后才進行下一個事務,絕對保證每個事務的正確執行,于是帶來的問題就是性能很低。

舉例:
A事務和B事務,B事務中有查詢和更新操作,在repeatable read下此時B事務先執行,但是執行到讀操作時,A事務進行查詢,此時B事務查詢完成發現有事務進行讀操作,于是更新操作無法完成。
這個時候A事務本應該查詢到B事務更新完成后的結果,但是卻查的更新前的結果。
在serializale下,B事務先執行,A事務排隊中,B事務執行結束后已經是更新后的結果,A事務拿到B事務更新后的結果值。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容