新建表

-----實驗1

--實驗2

實驗2把insert陳述句的內容也更新了!!!是因為實驗2 有重啟動更新
為什么 實驗1 沒有重啟動更新而實驗2有?
實驗1中session1在時間6 時 根據當前讀拿到 值=8,而一致讀的值=3,當前讀和一致讀不相等,為什么沒有發生更新重啟動?
uj5u.com熱心網友回復:
不應該出現這樣的問題啊uj5u.com熱心網友回復:
你可以試下,版本是11.2,uj5u.com熱心網友回復:
這樣子的認真研究的貼子不多了,推薦一下。歡迎大家討論。uj5u.com熱心網友回復:
求各位大佬解答uj5u.com熱心網友回復:
我測驗了下 確實是 這種情況,想不明白為啥
uj5u.com熱心網友回復:
我測驗的 結果是 不重啟也會更新insert 那個
uj5u.com熱心網友回復:
還有種情況,難道session1做了快取,加where后會重新重繪?不知道oracle怎么設計的uj5u.com熱心網友回復:
是很奇怪
uj5u.com熱心網友回復:
這兩個實驗唯一的不同點在于session1的兩個update陳述句,一個帶有where子句,一個沒有
我把這兩個陳述句的執行時的記憶體變化dump了一份,從其中可以看出,UGA與PGA差別不大,主要在于SGA中帶where子句的執行時會有一個回呼的程序,這就類似于程式中主函式與其他函式之間的關系一樣,只有主函式與既有主函式又有分函式的執行程序肯定是不一樣的,所以應該是這一步回呼的程序影響了最終的結果,不知道是否正確,請各位高手分析一下。
uj5u.com熱心網友回復:
也可以這樣理解,沒有where子句的時候,update會有一個操作集,即全表資料,而有where子句的時候,update的操作集由原來的全表資料,變成了篩選以后的結果集,而這兩個結果集的產生時間是不一樣的。uj5u.com熱心網友回復:
http://blog.itpub.net/28539951/viewspace-1705502/這個能很好地解決你這個問題
uj5u.com熱心網友回復:
這樣子的認真研究的貼子不多了,學習下uj5u.com熱心網友回復:
要理解這個問題,你需要理解事務隔離級別,你的實驗的級別應該是 read commit在這個級別下,oracle在查詢的時候得到的是所有已經 commit的資料,所以這個結果也就不難理解了。
2次結果的不一致在于你的實驗里面 >2 這個選項導致 0.5 的資料被篩掉了,并不是2次的實驗結果不一致,
從結果來看,其實2次的實驗結果是一致的,都是證明了oracle的事務隔離級別。
uj5u.com熱心網友回復:
我仔細看了一下樓主的問題,發現我之前的回復是有問題的,非常抱歉,希望沒有誤導你,現在就從原理上說明一下,你這個問題產生的原因,因為設計oracle的基本原理,希望你有耐心看下去。
oracle在事務控制上,有2個基本的概念,那就是 read commit和multiversion(多版本空值)。
read commit隔離級別決定了oracle的事務只有在提交以后,其他會話才能看到事務對資料的改變,但是這種隔離
級別不能保證事務內部的多次讀是一致的,也就是說會產生所謂幻讀的問題。
多版本控制,保證了單次讀是一致的,理解這個需要研究一些基本原理,這個不多說了。
然后是update的基本原理: 沒有條件的update是一次讀 有條件的update是兩次讀
實驗1: 由于updat沒有條件,是一次讀,所以資料的版本是陳述句開始的時候,所以0.5沒有被更新。
實驗2: 由于update有條件,是二次讀,所以資料版本是堵塞解除的時候,也就是說產生了幻讀,所以0.5被更新成了0.6
uj5u.com熱心網友回復:
你這圖畫的容易誤匯入,反正會發生鎖等待,2執行完了才1,1執行完了才3uj5u.com熱心網友回復:
學習正解?查詢 SELECThttp://www.verejava.com/?id=17173779389953
uj5u.com熱心網友回復:
生產了幻讀,用最高的事務隔離級別(串行化)就不會發生這種情況uj5u.com熱心網友回復:
安裝好了,不過不知道總是會出現一些問題uj5u.com熱心網友回復:
本人不夠專業,想法極端,執行實驗一時,可否認為是id in(1,2,3),實驗2可否認為是條件為映射,當映射發生變化時,條件隨之改變。在實驗一種加入id=4是否會發生變化呢。期待uj5u.com熱心網友回復:

試了一下負數,
應該是和條件有關,但是是什么原理還是不明白!
uj5u.com熱心網友回復:
這種情況在程式里面應該是不允許產生的uj5u.com熱心網友回復:
根本就沒看明白
uj5u.com熱心網友回復:
當 UPDATE 操作包含了 WHERE 條件,那么這個查詢的結果要滿足 WHERE 定義的查詢一致性,當更新發現一致性不滿足的情況下,就會觸發更新重啟動。而對于不包含 WHERE 條件或包含 WHERE 條件但是該條件與表查詢無關的情況,更新只關注 UPDATE 陳述句發出時刻的資料,不再考慮整體更新結果的一致性問題。
uj5u.com熱心網友回復:
這個就是oracle事務隔離引起的 oracle默認事務隔離級別是讀提交,也就是說只有提交的資料才會去讀uj5u.com熱心網友回復:
學習了。三人行,必有我師uj5u.com熱心網友回復:
session2中的陳述句沒有寫commit,所以符合條件的行都被鎖定,UPDATE是行鎖定。session1中的陳述句沒有限制條件,所以該陳述句要訪問session2中的行,所以會提示不能執行。session3中陳述句是插入陳述句,與session1中銷定的行不沖突,所以能執行uj5u.com熱心網友回復:
事務隔離級別問題uj5u.com熱心網友回復:
實驗二應該是沒問題的,而實驗1 我覺得可能你insert陳述句沒有及時提交所致。建議再作次實驗1,驗證下。uj5u.com熱心網友回復:
我覺得是你把本應該session3的insert 陳述句執行在了 session1 .uj5u.com熱心網友回復:
事務隔離級別的問題uj5u.com熱心網友回復:
session2 執行的時候要鎖了啊。uj5u.com熱心網友回復:
https://blog.csdn.net/enmotech/article/details/81058736,我覺得楊長老解釋的很對啊,這帖子怎么還掛在這兒?uj5u.com熱心網友回復:
我認為可以從范圍鎖和表級鎖來看,沒有加where條件的應該是表級排它鎖 導致所有的dml陳述句都阻塞,但是加了where以后是個范圍鎖 只在where>0的范圍行上加鎖,導致insert插入生效,然后提交更新范圍再次更新 導致0.5更新uj5u.com熱心網友回復:
Oracle 好難學,正在努力學習中!!!uj5u.com熱心網友回復:
我也覺得這個好難學,上面的各個都是大神uj5u.com熱心網友回復:
瞎說,session1的update根本不會阻塞session2里的update!轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/6893.html
標籤:開發
上一篇:有趣的存盤程序【持續更新】
