事務的四個隔離級別(4個):
-read uncommitted 讀未提交
-read committed 讀已提交
-repeatable read 可重複讀
-serializable 序列化
read uncommitted 讀未提交
事務a和事務b,事務a未提交的資料,事務b可以讀取到,這裡讀到的資料可以被稱為「髒讀」,最低的隔離級別,這種級別一般是理論存在,資料庫預設的隔離級別一般都是高於該級別的
read committed 讀已提交
事務a和事務b,事務a提交的資料,事務b才能讀取到。這種隔離級別高於上面的讀未提交,意思是:對方事務提交之後的資料,我當前事務才能夠讀取到。這種隔離級別可以避免髒資料,這種隔離級別會導致「不可重複讀」。這是oracle預設的隔離級別
假設事務1讀取了一條記錄(select user_name from user where user_id = 1),得到user_name = '456',事務1暫時沒提交。事務2更新了一條記錄(update user set user_name = '123' where user_id = 1),事務2提交。此時事務1再次select user_name from user where user_id = 1得到了user_name = '123',這樣就導致事務1在讀取同一行資料卻得到不同的user_name。這就是所謂的不可以重複讀
repeatable read 可重複讀
事務a和事務b,事務a提交之後的資料,事務b讀取不到。事務b是可重複讀取資料的,這種隔離級別高於讀已提交,意思是:對方提交之後的資料我還是讀取不到。這種隔離級別可以避免「不可重複讀取」,達到可重複讀取,但是會導致「幻讀」。這是mysql預設的隔離級別
這個跟不可重複讀相反,當事務1查詢到user_name='456'時,事務2將user_name更新成'123'並提交,事務1再次查詢還是會發現user_name='456',這樣保證了可重複讀。幻讀的話就是當事務2插入一條新的資料id為2並提交,事務1由於可重複讀的性質,只能在表中查到id為1的資料,如果此時事務1插入id為2的資料則會產生錯誤,因為此時表中已經有了id為2的資料,但是事務1只看到了id為1的資料。
serializable 序列化
穿行排隊等待
MySQL事務的四個隔離級別詳解
概述 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單...
MySQL事務的四個隔離級別解析
概述 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單...
怎麼理解SQL的四個事務隔離級別?
事務的隔離級別是為了解決併發問題。那麼先來了解下併發帶來的問題 1 丟失更新 lost update 沒有加鎖 兩個事務同時更新一行資料,最後乙個事務的更新會覆蓋掉第乙個事務的更新,從而導致第乙個事務更新的資料丟失,這是由於沒有加鎖造成的。2 髒讀dirty reads 沒有隔離 乙個事務看到了另外...