為什麼要使用事務的隔離級別?
對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有採取必要的隔離機制, 就會導致各種併發問題:
•髒讀: 對於兩個事物 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
具體使用
以上的四個事務隔離級別都是在connection介面中定義的靜態常量,
使用settransactionisolation(int level) 方法可以設定事務隔離級別。
如:con.settransactionisolation(connection.repeatable_read);
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...