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(),將游標移到和結果集結構類似的傳沖去中
然後可以使用update***(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語句。
java中事務的隔離級別 依賴注入和控制反轉
事務的幾種傳播特性 1.propagation required 如果存在乙個事務,則支援當前事務。如果沒有事務則開啟 2.propagation supports 如果存在乙個事務,支援當前事務。如果沒有事務,則非事務的執行 3.propagation mandatory 如果已經存在乙個事務,支...
事務級別mysql mysql事務級別設定
一 全域性設定 1.全域性修改,修改mysql.ini配置檔案,在最後加上 可選引數有 read uncommitted,read committed,repeatable read,serializable.mysqld transaction isolation repeatable read ...
事務隔離級別
1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...