如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。
假設第乙個事務被還原後,第二個事務所讀取的更改值將是無效的,那麼是否可允許這種衝突?jdbc使用者可用以下**來指示dbms允許在值被提交前讀取該值("dirty讀取"),其中con是當前連線:
con.settransactionisolation(transaction_read_uncommitted);
事務隔離級別越高,為避免衝突所花的精力也就越多。connection介面定義了五級,其中最低級別指定了根本就不支援事務,而最高端別則指定當事務在對某個資料庫進行操作時,任何其它事務不得對那個事務正在讀取的資料進行任何更改。通常,隔離級別越高,應用程式執行的速度也就越慢(由於用於鎖定的資源耗費增加了,而使用者間的併發操作減少了)。在決定採用什麼隔離級別時,開發人員必須在效能需求和資料一致性需求之間進行權衡。當然,實際所能支援的級別取決於所涉及的dbms的功能。
當建立connection物件時,其事務隔離級別取決於驅動程式,但通常是所涉及的資料庫的預設值。使用者可通過呼叫setisolationlevel方法來更改事務隔離級別。新的級別將在該連線過程的剩餘時間內生效。要想只改變乙個事務的事務隔離級別,必須在該事務開始前進行設定,並在該事務結束後進行復位。我們不提倡在事務的中途對事務隔離級別進行更改,因為這將立即觸發commit方法的呼叫,使在此之前所作的任何更改變成永久性的。
jdbc的資料隔離級別設定:
jdbc
資料庫隔離級別
資料訪問情況
transaction_read_uncommitted
ur就是俗稱「髒讀」(dirty read),在沒有提交資料時能夠讀到已經更新的資料
transaction_read_committed
cs在乙個事務中進行查詢時,允許讀取提交前的資料,資料提交後,當前查詢就可以讀取到資料。update資料時候並不鎖住表
transaction_repeatable_read
rs在乙個事務中進行查詢時,不允許讀取其他事務update的資料,允許讀取到其他事務提交的新增資料
transaction_serializable
rr在乙個事務中進行查詢時,不允許任何對這個查詢表的資料修改。
jdbc事務隔離級別
為了解決與「多個執行緒請求相同資料」相關的問題,事務之間用鎖相互隔開。多數主流的資料庫支援不同型別的鎖;因此,jdbc api 支援不同型別的事務,它們由 connection 物件指派或確定。在 jdbc api 中可以獲得下列事務級別:
transaction_none 說明不支援事務。
transaction_read_uncommitted 說明在提交前乙個事務可以看到另乙個事務的變化。這樣髒讀、不可重複的讀和虛讀都是允許的。
transaction_read_committed 說明讀取未提交的資料是不允許的。這個級別仍然允許不可重複的讀和虛讀產生。
transaction_repeatable_read 說明事務保證能夠再次讀取相同的資料而不會失敗,但虛讀仍然會出現。
transaction_serializable 是最高的事務級別,它防止髒讀、不可重複的讀和虛讀。
為了在效能與一致性之間尋求平衡才出現了上面的幾種級別。事務保護的級別越高,效能損失就越大。
假定您的資料庫和 jdbc 驅動程式支援這個特性,則給定乙個 connection 物件,您可以明確地設定想要的事務級別:
conn.settransactionlevel(transaction_serializable) ;
可以通過下面的方法確定當前事務的級別:
int level = conn.gettransactionisolation();
if(level == connection.transaction_none)
system.out.println("transaction_none");
else if(level == connection.transaction_read_uncommitted)
system.out.println("transaction_read_uncommitted");
else if(level == connection.transaction_read_committed)
system.out.println("transaction_read_committed");
else if(level == connection.transaction_repeatable_read)
system.out.println("transaction_repeatable_read");
else if(level == connection.transaction_serializable)
system.out.println("transaction_serializable");
JDBC事務隔離級別
如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。假設第乙個事務被還原後,第二個事務所讀取的更改值將是...
JDBC事務隔離級別
如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。假設第乙個事務被還原後,第二個事務所讀取的更改值將是...
JDBC事務隔離級別
如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。假設第乙個事務被還原後,第二個事務所讀取的更改值將是...