JDBC ORACLE數據庫隔離級別
數據庫的隔離級別:
於同時運行的多個事務, 當這些事務訪問數據庫中相同的數據時, 如果沒有采取必要的隔離機制, 就會導致各種並發問題:
髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的字段. 之後, 若 T2 回滾,
T1讀取的內容就是臨時且無效的.
不可重復讀: 對於兩個事物 T1, T2, T1 讀取了一個字段, 然後 T2 更新了該字段. 之後, T1再次讀取同一個字段, 值就不同了.
幻讀: 對於兩對個事物 T1, T2, T1 從一個表中讀取了一個字段, 然後 T2 在該表中插入了一些新的行.
之後, 如果 T1 再次讀取同一個表, 就會多出幾行.
數據庫事務的隔離性: 數據庫系統必須具有隔離並發運行各個事務的能力, 使它們不會相互影響, 避免各種並發問題.
一個事務與其他事務隔離的程度稱為隔離級別. 數據庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度,
隔離級別越高, 數據一致性就越好, 但並發性越弱.
JDBC Conntion類中的隔離級別
int TRANSACTION_NONE = 0;
//讀未提交數據
int TRANSACTION_READ_UNCOMMITTED = 1;
//讀已提交數據
int TRANSACTION_READ_COMMITTED = 2;
//可重復讀數據:確保事物可以多次從一個字段中讀取相同的值,在事物持續期間禁止其他事物對該事物進行更新,
//可以避免數據髒讀和不可重復讀,但幻讀依然存在
int TRANSACTION_REPEATABLE_READ = 4;
//串行話:確保事物可以從一個表中讀取相同的行,在這個事物持續期間禁止其他事物對該表執行插入 更新和刪除操作,
//所有的並發問題都可以避免 但效率非常低
int TRANSACTION_SERIALIZABLE = 8;
Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE. Oracle 默認的事務隔離級別為: READ COMMITED
有時候有必要在代碼中設置事物隔離級別:
connection.setTransactionIsolation(Connection.TRANSACTION_NONE);