幻读Java_脏读、幻读、不可重复读和丢失更新
1.臟讀 -- 一個事務(wù)讀取到另外一個事務(wù)沒有提交的數(shù)據(jù)
事務(wù)T1:更新一條數(shù)據(jù)
-->事務(wù)T2:讀取事務(wù)T1更新的記錄
事務(wù)T1:調(diào)用commit進行提交
此時事務(wù)T2讀取到的數(shù)據(jù)是保存在數(shù)據(jù)庫內(nèi)存中的數(shù)據(jù),稱為臟數(shù)據(jù),這個過程稱為臟讀。
2.幻讀? -- 用同一的操作讀取2次,得到的記錄數(shù)不相同
事務(wù)T1:查詢表中所有記錄
-->事務(wù)T2:插入一條記錄
-->事務(wù)T2:調(diào)用commit進行提交
事務(wù)T1:再次查詢表中所有記錄
注意:幻讀重點在新增或刪除。
3.不可重復(fù)讀 -- 在同一事務(wù)中,2次讀取同一數(shù)據(jù),得到內(nèi)容不同
事務(wù)T1:查詢一條記錄
-->事務(wù)T2:更新事務(wù)T1查詢的記錄
-->事務(wù)T2:調(diào)用commit進行提交
事務(wù)T1:再次查詢上次的記錄
此時事務(wù)T1對同一數(shù)據(jù)查詢了兩次,可得到的內(nèi)容不同,稱為不可重復(fù)讀。
注意:不可重復(fù)讀重點在修改。
4.丟失更新(Lost Update)
事務(wù)T1讀取了數(shù)據(jù),并執(zhí)行了一些操作,然后更新數(shù)據(jù)。事務(wù)T2也做相同的事,則T1和T2更新數(shù)據(jù)時可能會覆蓋對方的更新,從而引起錯誤。
5.處理以上隔離級別的問題,采用如下方法:
事務(wù)隔離五種級別:
(1)TRANSACTION_NONE? 不使用事務(wù)。
(2)TRANSACTION_READ_UNCOMMITTED? 允許臟讀。
(3)TRANSACTION_READ_COMMITTED? 防止臟讀,最常用的隔離級別,并且是大多數(shù)數(shù)據(jù)庫的默認隔離級別。
(4)TRANSACTION_REPEATABLE_READ? 可以防止臟讀和不可重復(fù)讀。
(5)TRANSACTION_SERIALIZABLE? 可以防止臟讀,不可重復(fù)讀取和幻讀,(事務(wù)串行化)會降低數(shù)據(jù)庫的效率。
以上的五個事務(wù)隔離級別都是在Connection接口中定義的靜態(tài)常量,使用setTransactionIsolation(int level) 方法可以設(shè)置事務(wù)隔離級別。
如:con.setTransactionIsolation(Connection.REPEATABLE_READ)。
注意:事務(wù)的隔離級別受數(shù)據(jù)庫的限制,不同的數(shù)據(jù)庫支持的的隔離級別不一定相同。
總結(jié)
以上是生活随笔為你收集整理的幻读Java_脏读、幻读、不可重复读和丢失更新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LaTeX数学符号
- 下一篇: 机器学习入门:隐马尔科夫模型-8