對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有採取必要的隔離機制, 就會導致各種併發問題:
• 髒讀: 對於兩個事物 t1, t2, t1 讀取了已經被 t2 更新但還沒有被提交的字段. 之後, 若 t2 回滾, t1讀取的內容就是臨時且無效的.
• 不可重複讀: 對於兩個事物 t1, t2, t1 讀取了乙個字段, 然後 t2 更新了該字段. 之後, t1再次讀取同乙個字段, 值就不同了.
• 幻讀: 對於兩個事物 t1, t2, t1 從乙個表中讀取了乙個字段, 然後 t2 在該表中插入了一些新的行. 之後, 如果 t1 再次讀取同乙個表, 就會多出幾行.
資料庫事務的隔離性: 資料庫系統必須具有隔離併發執行各個事務的能力, 使它們不會相互影響, 避免各種併發問題.
乙個事務與其他事務隔離的程度稱為隔離級別. 資料庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 資料一致性就越好, 但併發性越弱
資料庫提供了4中隔離級別:
隔離級別 描述
read uncommitted(讀未提交資料) 允許事務讀取未被其他事務提交的變更,髒讀、不可重複讀和幻讀的問題都會出現
read commited(讀已提交資料) 只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不可重複讀和幻讀問題仍然會出現
repeatable read(可重複讀) 確保事務可以多次從乙個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個字段進行更新,可以避免髒讀和不可重複讀,但幻讀的問題依然存在
serializable(序列化) 確保事務可以從乙個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該錶執行插入、更新和刪除操作,所有併發問題都可以避免,但效能十分低
oracle 支援的 2 種事務隔離級別:read commited, serializable. oracle 預設的事務隔離級別為: read commited
mysql 支援 4 中事務隔離級別. mysql 預設的事務隔離級別為: repeatable read
資料庫隔離級別
read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...
資料庫隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...
資料庫隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...