数据库 / 事务的隔离级别
一、什么是事務的隔離性?
兩個人同時在一個畫本上畫畫,過程中你一筆我一筆,那么最后最后畫出來的一定是一個四不像,多個事務同時操作一個數據也會和上面的情況類似,所以為了讓不同的事務之間相互不存在干擾,就需要對事務的操作進行隔離,事務的隔離性也就是將操作同一個數據的事務相互分離,讓操作之間分開有序的執行。
二、如果不對事務進行隔離會有哪些問題?
在數據庫中,如果多個事務可以同時操作一個數據,那么就會產生臟讀、重復讀、幻讀的問題。
1、臟讀
出現原因:修改數據的同時可以讀取數據。
案例: 以存款為例,假設 A 與 B 同用一張銀行卡,銀行卡內余額為 1000 。
操作: 如下圖所示,當事務 B 對余額進行了修改但是未提交事務,此時事務 A 對銀行卡余額進行讀取,并且在這個數據的基礎上進行業務操作,進行存款,結果會導致最終的銀行卡余額出現問題 ;
2、不重復讀
出現原因: 讀取數據的同時可以進行修改;
案例: 以取款為例,假設 A 與 B 同用一張銀行卡,銀行卡內余額為1000。
操作: 如下圖所示,事務 A ,事務 B 同時對余額進行訪問,事務 A 對余額進行讀取,事務 B 對余額進行修改,當事務 A 第一次對余額進行讀取后,此時事務 B 提交,那么當事務 A 第二次讀取該數據時的數據就與第一次讀取的數據不同,這種情況稱為可重復讀;
3、幻讀
出現原因:讀取和修改的時候可以 insert 數據;
案例: 以打印銀行卡賬單存款記錄為例,假設 A 與 B 同用一張銀行卡,銀行卡內存款記錄為兩條。
操作: 如下圖所示,存款表有 2 條數據,A 對存款表進行讀取, 當 A 第一次讀取到存款記錄的時候只有 2 條數據; 但是與此同時 B 往銀行卡進行了一筆存款然后提交了事務,在 B 提交了存款事務之后,A 執行了打印操 作,最后發現打印存款表信息的時候卻發現有 3 條數據,與之前查出的數據不一樣,這種平白無故多出來 的數據就好象發生了幻覺一樣所以稱為幻讀;
三、事務的四種級別
就像上面所說的,如果不對事務進行隔離那么勢必就會產生很多問題,所以就需要一種機制來對不同事務間的操作進行隔離,讓彼此之間相互不影響,數據庫對事務隔離設置有四種程度的級別,分別為讀未提交、讀提交、重復讀、序列化;級別依次從低倒高,級別越高事務的之間的隔離操作就越嚴格,當然要求越嚴格其性能也會越低。
1、READ_UNCOMMITTED(讀未提交)
這種情況只限制了兩個數據不能同時修改,但是修改數據的時候是可以讀取的,這級別的事務隔離有臟讀、重復讀、幻讀的問題;
2、READ_COMMITTED(讀提交)
這種隔離級別的事務限制了修改數據的時候不允許讀取,但是讀取數據的時候是可以進行修改的,所以這種事務的隔離級別解決了臟讀問題,但會存在重復讀、幻讀問題;
3、REPEATABLE_READ(重復讀)
這種隔離級別的事務限制了讀取數據的時候也不可以進行修改,所以解決了重復讀的問題,但是讀取范圍數據的時候可以插入數據,所以還會存在幻讀問題;
4、SERIALIZABLE (序列化)
事務最高隔離級別,在該級別下,所有事務都是進行串行化順序執行,這樣就可以避免臟讀、不可重復讀與幻讀所有問題了。但是這種事務隔離級別下事務執行的效率低下,比較耗數據庫性能。
轉載于:https://zhuanlan.zhihu.com/p/27790194
(SAW:Game Over!)
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的数据库 / 事务的隔离级别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 数据库 / 事务的 ACID
- 下一篇: OS / 5 种 IO 模型
