1. 程式人生 > >關於髒讀,不可重複讀,幻讀的理解

關於髒讀,不可重複讀,幻讀的理解

事務總結:
事務的特性:★★★
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序列化,就相當於鎖表,某一時間內只允許一個事務訪問該表。