分析了一些面試題,發現關於事務的隔離級別問的也很頻繁,於是就特地來學習這一塊的知識,並進行總結整理自己的思路,希望會對有需要的人有一些幫助。
事務簡單的來說就是資料庫的一組操作要麼一起成功要麼一起失敗。
事務具有以下四個屬性:原子性、一致性、隔離性、永續性,通常稱為acid特性
今天我們主要來**的是事務的隔離性中的隔離級別。
為什麼會有隔離級別的出現呢?原因是當資料庫中多個事務同時執行時,可能出現髒讀(dirty read),不可重複讀(non - repeatable read),幻讀(phantom read)等問題,於是就出現了隔離級別。
注意:不可重複讀是指多次讀取同乙個資料的內容不一致,而幻讀是指多次讀取資料總量不一致,對於不重複讀,只需要鎖某一行資料,對於幻讀則需要鎖整個表。了解了出現隔離級別的原因後,再來了解一下隔離級別有哪些:
這四種隔離級別,是否存在髒讀、不可重複讀、幻讀的情況:
隔離級別
髒讀不可重複讀
幻讀讀未提交是是
是讀提交否是
是可重複讀否否
是序列化否否
否當然隔離級別越高,效率就越低,所以應該找到乙個平衡點。
接下來,我們使用乙個例項,來進一步了解這四個隔離級別。
其中,事務a為多次讀取資料,事務b為將v的值由1修改為2,下面是按照時間順序得執行過程。其中(v1,v2,v3分別代表在不同時間讀取v得值)
事務a事務b
啟動事務,讀取資料v =1
啟動事務
讀取資料v= 1
將v的值修改為 2
讀取資料v1
提交事務b
讀取到值v2
提交事務a
讀取到值v3
那麼使用不同得隔離級別,不同時刻得到得值就不相同:
隔離級別
v1值v2值
v3值讀未提交22
2讀提交12
2可重複讀11
2序列化11
2其中讀未提交,表示只要b修改後a立馬就可以讀到修改後得數值;
讀提交是等到b事務提交後,a才可以讀到b得修改內容;
而可重複讀中,事務a開始讀到得v值是1那麼直到事務a執行結束前,讀到的都是起始時的值1;
對於序列化,由於a事務首先讀到v的值,當b事務準備修改v的值時,就會被鎖定,直到事務a提交後,才能繼續執行b中的操作。
在mysql中的預設隔離級別是:可重複讀, 而在sql sever 和oracle 中預設隔離級別是:讀提交。
這裡為什麼mysql不使用讀提交呢?原因是在mysql5.0版本前,binlog只支援statement這種複製格式,而這種格式在讀已提交(read commited)這個隔離級別下主從複製是有bug的,因此mysql將可重複讀(repeatable read)作為預設的隔離級別。我們了解了事務隔離的各種級別後,那麼事務隔離具體是怎樣實現的呢?
在mysql中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值通過回滾操作都可以得到未修改前的值,不同時刻啟動的事務會有不同的read-view來表示某個操作執行前的狀態。
而長事務意味著系統裡面會存在很老的事務檢視。由於這些事務隨時可能訪問資料庫裡面的任何資料,所以這個事務提交之前,資料庫裡面它可能用到的回滾記錄都必須保留,這就會導致大量占用儲存空間。
以上就是自己對事務的隔離級別的理解,有任何問題歡迎指正。
MySQL資料庫事務隔離
mysql資料庫事務隔離級別主要有四種 1,serializable 序列化,乙個事務乙個事務的執行 2,repeatable read 可重複讀,無論其他事務是否修改並提交了資料,在這個事務中看到的資料值始終不受其他事務影響 3,read committed 讀取已提交,其他事務提交了對資料的修改...
mysql資料庫事務隔離級別
1修改事務隔離級別 全域性修改 修改mysql.ini配置檔案 mysqlid transaction isolation repeatble read 對當前session修改 登入mysql客戶端後,執行命令set session transaction isolation level read...
MYSQL 資料庫 事務 隔離級別
定義 在資料庫 中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別,由低到高依次為 1 read uncommitted 未授權讀取 讀未提交 2 read committed 授權讀取 讀提交 3 repeatable read 可重複讀取 4 serializable 序列化 這四個事務隔...