jdbc 系列文章列表, 請檢視目錄: 《jdbc學習筆記》當多個事務併發執行時, 如果多個事務同時運算元據庫中的相同資料,那麼就容易產生併發問題. 筆者通過兩個事務t1, t2 來舉例:
資料庫提供四種隔離級別,
隔離級別
隔離級別
描述read uncommitted
讀未提交
允許事務讀取其它事務未提交的變更, 事務隔離性最低.
read commited
讀已提交
只允許事務讀取已提交的資料變更, 可以避免髒讀.
repeatable read
可重複讀
確保在乙個事務中, 多次從乙個欄位中可獲取相同的值,
也就是說在這個事務期間, 其它事務禁止對此字段進行變更.
serializable
序列化確保對同一張表, 事務只能乙個乙個執行, 不允許有併發事務執行.
也就是說在次事務期間, 禁止任何事務對此表進行增刪改操作. 可避免併發問題, 但效能低下
不同的隔離級別, 可避免部分併發問題. 隔離性越高, 效能就越差.
隔離級別
髒讀不可重複讀
幻讀描述
read uncommitted√√
√效能最高, 隔離性最差. 事務併發時髒讀, 不可重複讀, 幻讀均有可能產生
read commitedx√
√應用最廣泛, 可有效避免髒讀, 但可能產生不可重複讀, 幻讀現象
repeatable readxx
√可避免髒讀, 不可重複讀息現象. 但有可能產生幻讀現象
serializablexx
x效能最低, 隔離線最強. 事務併發時, 可有效避免髒讀, 不可重複讀, 幻讀的產生
首先, 封裝乙個對使用者表t_user 進行操作的工具類.
public
class
userdaoutil
catch
(sqlexception e)
}// 通過id 查詢物件
public
static userpo findbyid
(connection connection, integer id)
}catch
(sqlexception e)
return userpo;
}// 通過id更新密碼
public
static
void
updatepassword
(connection connection, integer id)
catch
(sqlexception e)
}}
// 測試髒讀
@test
public
void
test1()
throws exception
catch
(exception ex)}}
.run()
;// 主線程休眠
thread.
sleep
(3000l)
;// 提交事務回滾
connection.
rollback()
;}
@test
public void test2() throws exception
}.run();
thread.sleep(3000);
userpo user2 = userdaoutil.findbyid(connection, 1);
system.out.println("第2次查詢:" + user2);
}
// 測試幻讀
@test
public
void
test3()
throws exception}.
run();
// 主線程休眠
thread.
sleep
(3000l);if
(user10 == null)
}
09 JDBC實現事務管理
開發中,在業務層 service 控制事務!在jdbc中處理事務,都是通過connection完成的,同一事務中所有的操作,都在使用同乙個connection物件。commit rollback connection conn jdbcutil.getconnection trycatch exce...
JDBC事務隔離級別
如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。假設第乙個事務被還原後,第二個事務所讀取的更改值將是...
JDBC事務隔離級別
如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。假設第乙個事務被還原後,第二個事務所讀取的更改值將是...