為什么我只說通俗易懂版不說嚴謹版?
因為嚴謹版遍地都是, 但是他們卻有一個缺點就是讓人看得云里霧里, 所以這就是我寫通俗易懂版的初衷!
但是既然是通俗易懂版就必然有缺陷, 只為了各位在開發過程中頭腦更加清晰, 如有錯誤還望兄弟們不吝賜教!
在MySQL數據庫中,事務一共有4中隔離級別,它們分別是:
1. 讀未提交: 就是在一個事務中, 可以查詢到其他事務中執行了update或者insert卻沒有執行commit語句的數據,所以會產生臟讀,幻讀,不可重復讀的問題(稍后再解釋)
2. 讀已提交(oracle和sqlServer默認的隔離級別): 就是在一個事務中, 不能查詢到其他事務中執行了update卻沒有執行commit語句的數據了,但是commit后,就能查詢到了,這個級別解決了臟讀的問題
3. 可重復讀(mysql默認的隔離級別): 可以理解為當一個事務開始時, 對整個數據庫進行了一次快照,你接下來的所有查詢都只能查詢到快照中的數據,即使可能這個數據已經被其他事務修改了一千次一萬次你也不會知道,插入或者刪除多少數據也同理與你本次事務無關
4. 串行化: 可以理解為 如果有多個事務同時訪問同一個數據庫, 即使他們要操作的表毫無關聯, 也要排隊一個個等上一個事務commit,從根本上避免了各種問題,但是效率極低
臟讀: 我查詢到了其他事務中update了但還未commit的數據
幻讀: 我使用相同條件查詢多次, 結果集可能由于其他已經commit的事務進行了新增或者刪除操作導致數據量發生了變化
不可重復讀:?我使用相同條件查詢多次, 結果集可能由于其他已經commit的事務進行了update操作導致數據內容發生了變化