首先, 這篇部落格關於不可重複讀和幻讀的內容介紹的十分清晰
以下為自己理解:
事務總結:
事務的特性:★★★
acid
原子性:事務裡面的操作單元不可切割,要麼全部成功,要麼全部失敗
一致性:事務執行前後,業務狀態和其他業務狀態保持一致.
隔離性:乙個事務執行的時候最好不要受到其他事務的影響
永續性:一旦事務提交或者回滾.這個狀態都要持久化到資料庫中
不考慮隔離性會出現的讀問題
髒讀:在乙個事務中讀取到另乙個事務沒有提交的資料
不可重複讀:在乙個事務中,兩次查詢的結果不一致(針對的update操作)
虛讀(幻讀):在乙個事務中,兩次查詢的結果不一致(針對的insert操作)
通過設定資料庫的隔離級別來避免上面的問題(理解)
read uncommitted 讀未提交 上面的三個問題都會出現
read committed 讀已提交 可以避免髒讀的發生
repeatable read 可重複讀 可以避免髒讀和不可重複讀的發生
serializable 序列化 可以避免所有的問題
起初隔離級別為read uncommitted 讀未提交;a,b兩個會話,分別開啟兩個事務,然後a向b轉了500元錢,但a未提交該事務,
此時b檢視,發現多了500.然後a回滾事務,b再檢視賬戶,發現根本就沒有多500.這便是髒讀。
髒讀便是可以讀取到另乙個事務尚未提交的資料。
如果我們此時將隔離級別提公升為read committed 讀已提交,便可避免髒讀。同樣b兩個會話,分別開啟兩個事務,然後a向b轉了500元錢,
但a未提交該事務,此時b檢視,依舊是原錢數.
但此時,如果a 提交事務,b再去檢視,發現此時多了500,對b而言,在乙個事務中,兩次查詢的結果不一致,這便是不可重複讀。
如果我們此時將隔離級別提公升為repeatable read 可重複讀,可以避免髒讀和不可重複讀的發生。同樣a 提交事務,b再去檢視,發現
依舊是原錢數,b只能結束當前事務,在開啟乙個新事務,才能查詢到資料的變化,這al便避免了不可重複讀。
如果我們設定了seriizable序列化,就相當於鎖表,某一時間內只允許乙個事務訪問該錶。
關於事務的ACID
這是關於資料庫方面的知識,事務的acid分別是指 原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務前後資料的完整性必須保持一致。隔離性 isolation 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為...
事務的ACID 屬性
事務的四大屬性acid即事務的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務必須使資料...
事務ACID的實現
事務需要滿足acid特性,那在資料庫中,它是如何實現的?我們接下來的內容將一一介紹。其實我們在 mysql innodb引擎 mvcc併發控制 中談到了事務的隔離級別,但沒有談到怎樣實現隔離性。我們提到了要消除幻讀,一般的資料庫系統需要保證序列化的事務隔離級別,而mysql innodb在可重複讀的...