JDBC 筆記3: JDBC事務併發產生的問題和事務隔離級別


JDBC事務併發產生的問題和事務隔離級別
原子操作使用事務,一組相關的操作。
數據庫是事務性的資源,在數據庫中所有的操作都與事務相關。JDBC中自動提交是打開的,所以我們感覺不到事務。
 1,如果con.setAutoCommit(false);就可以由我們提交。
 2, update
  insert
  delete
 
 3,    con.commit();或com.rollback();

1,髒讀(dirty read),讀取到了沒有提交的數據。
2,不可重複讀(UnPrpeatable Read),兩次讀取到了不同的數據,就是要保持在同一時間點上兩次讀取到的數據相同,不能夠使查詢數據時進行改變。
3,幻讀(phantom),在兩次查詢同一時間點數據時,數據數量發生改變,要保持在同一時間點上兩次讀取到的數據相同。

事務隔離級別

TRANSACTION_NONE不使用事務。理論上的,實際沒用。
TRANSACTION_READ_UNCOMMITTED 可以讀取爲提交數據。能髒讀,這個級別沒用,都不控制。
TRANSACTION_READ_COMMITTED 可以避免髒讀,不能夠讀取沒提交的數據,最常用的隔離級別  大部分數據庫的默認隔離級別
TRANSACTION_REPEATABLE_READ可以避免髒讀,不可重複讀取,
TRANSACTION_SERIALIZABLE可以避免髒讀,重複讀取和幻讀,(事務串行化)會降低數據庫效率

以上的五個事務隔離級別都是在Connection類中定義的靜態常量,使用setTransactionIsolation(int level) 方法可以設置事務隔離級別。

JDBC2.0新特性

可滾動結果集(可雙向滾動),這種結果集不但可以雙向滾動,相對定位,絕對定位,並且可以修改數據信息。

滾動特性
next(),此方法是使遊標向下一條記錄移動。
previous() ,此方法可以使遊標上一條記錄移動,前提前面還有記錄。
absolute(int row),可以使用此方法跳到指定的記錄位置。定位成功返回true,不成功返回false,返回值爲false,則遊標不會移動。
afterLast() ,遊標跳到最後一條記錄之後。
beforeFirst() ,遊標跳到第一條記錄之前。(跳到遊標初始位)
first(),遊標指向第一條記錄。
last(),有彪指向最後一條記錄。
relative(int rows) ,相對定位方法,參數值可正可負,參數爲正,遊標從當前位置向下移動指定值,參數爲負,遊標從當前位置向上移動指定值。

TYPE_FORWARD_ONLY ,該常量指示指針只能向前移動的 ResultSet 對象的類型。

TYPE_SCROLL_INSENSITIVE ,該常量指示可滾動但通常不受其他的更改影響的 ResultSet 對象的類型。
TYPE_SCROLL_SENSITIVE ,該常量指示可滾動並且通常受其他的更改影響的 ResultSet 對象的類型。
         
要使用可滾動結果集時,要在Statement創建時指定參數,纔可以使用
Statement st=null;
st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)

ResultSet結果集中,先使用moveToInsertRow(),將遊標移到和結果集結構類似的傳衝去中
然後可以使用updateXxx(int column,columnType value)方法來更新指定列數據,再使用insertRow() 方法插入記錄,
最後將遊標指回原位,moveToCurrentRow() 。

能否使用可更新結果集,要看使用的數據庫驅動是否支持,還有隻能用於單表且表中有主鍵字段(可能會是聯合主鍵)
,不能夠有表連接,會取所有非空字段且沒有默認值。

能否使用JDBC2.0 ResultSet的新特性要看數據庫驅動程序是否支持。

批處理更新
Statement
addBatch(String sql), 方法會在批處理緩存中加入一條sql語句
executeBatch() ,執行批處理緩存中的所有sql語句。

PreparedStatement

addBatch() 將一組參數添加到此 PreparedStatement 對象的批處理命令中。
executeBatch() 將一批命令提交給數據庫來執行,如果全部命令執行成功,則返回更新計數組成的數組。
PreparedStatement中使用批量更新時,要先設置好參數後使用addBatch()方法加入緩存。
注意:批量更新中只能使用更新或插入語句

execute(String sql),這個方法的返回值是boolean類型,如果返回true就表示sql是一個select語句,可以通過getResultSet()獲得結果集,如果是false,sql就是DML語句或者是DDL語句。
 

發佈了19 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章