在分布式的系統中,通常會有多個執行緒連線到資料庫中同時對乙個表進行操作(這裡的同時並不表示同乙個時間點,而是同時競爭cpu的資源,至於如何排程,就要看執行緒和作業系統如何進行排程了),這種情況下如果會話的事物設定不當,就會導致資料混亂,常常會出現以下三種情況(假設現在系統中有兩個會話a和b,同時對錶t_test操作):
1.髒讀:假如a開啟事物後,在查詢之前,b修改了表中的某條記錄,但是事物還沒提交,這個時候a再讀取該錶時,讀到了b修改之後的資料,問題發生了:b如果此時回滾了事物,那麼a讀到的就是錯誤的資料了。
2.不可重複讀:假如a開啟事物後,對錶做了查詢後,此時b修改了表中的某條記錄,然後a又做了一次查詢,問題發生了:對於事物a,第一次讀取的結果對應的記錄和第二次讀取的結果不一致了
3.幻讀:假如a開啟事物後,對錶做了查詢,此時b在表中新增了一條資料,然後a又做了一次查詢,問題發生了:對於事物a,第二次讀取的結果比第一次讀取的結果多出一條記錄
因此,在jdbc的規範中對事物隔離級別做了相應的規定。
1.讀未提交(read uncommitted):這種隔離級別可以讓當前事務讀取到其它事物還沒有提交的資料。這種讀取應該是在回滾段中完成的。通過上面的分析,這種隔離級別是最低的,會導致引發髒讀,不可重複讀,和幻讀。
2.讀已提交(read committed):這種隔離級別可以讓當前事務讀取到其它事物已經提交的資料。通過上面的分析,這種隔離級別會導致引發不可重複讀,和幻讀。
3.可重複讀取(repeatable read):這種隔離級別可以保證在乙個事物中多次讀取特定記錄的時候都是一樣的。通過上面的分析,這種隔離級別會導致引發幻讀。
4.序列(serializable):這種隔離級別將事物放在乙個佇列中,每個事物開始之後,別的事物被掛起。同乙個時間點只能有乙個事物能運算元據庫物件。這種隔離級別對於資料的完整性是最高的,但是同時大大降低了系統的可併發性。
事物隔離級別
自然也是支援四種事務隔離級別的 read uncommitted,read commit,repeatable read serializable,下面就分別最四種隔離級別在實現的鎖機制做乙個簡介 serializable 1 這種隔離級別對資料的要求最為嚴格,自然也是效能最差的一種隔離級別。在所有...
事物隔離級別
隔離級別從松到緊 讀未提交,讀提交 重複讀,序列化。讀未提交 可能會出現髒讀的情況 例子 你去買5個包子。人多。店員拿的急多方乙個,袋子裡有6個,這個時候,你眼睛一瞟。心裡美滋滋。付錢的時候老闆檢查了一下,發現多了乙個,就拿走了乙個,然後你付錢走人 提交事務 這時候你就發現實際上袋子裡只有5個,但是...
事物隔離級別
事務隔離級別 1.更新遺失 lost update 兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出,導致對資料的兩個修改都失效了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。基本上就是指某個事務對欄位進行更新的資訊,因另乙個事務的介入而遺失更新效力。舉例來說,若某個字段...