1.什麼是併發
2.事務隔離級別
2.1 read uncommitted
2.2 read committed
2.3 repetable read
2.4 serializable
2.5 read only
3.多版本讀一致性含義
4.寫一致性
1.多版本控制是指,oracle能同時物化多個版本的資料,這也是oracle提供讀一致性的基礎。
2.事務隔離級別
不同隔離級別可能允許或不允許的3種現象:
髒讀(dirty read)
你能讀取未提交的資料
不可重複讀(nonrepeatable read)
t1和t2時間讀取某一行的結果不一樣。
幻讀(phantom read)
t1執行查詢,t2再執行這個查詢,可能增加了一些行。
不可重複讀和幻影讀區別在於,幻讀中,已經讀取的資料沒有變化,t2比t1有更多的資料滿足你的查詢條件。
隔離級別
髒讀不可重複讀
幻讀 read uncommitted√√
√ read committed×√
√repetable read××
√ serializable read××
×
行賬號賬戶餘額
1123$500
2456$240.25
….342 023
987$100
select sum(acount_balance) from accounts;
在查詢中的某個時刻將$400從123轉入987,未提交
不同隔離級別,非oracle資料庫和oracle資料庫的表現
非oracle
oracle
read uncommitted
先計算一次123賬號的$400,(在讀123到987期間,發生了轉賬),讀到987的時候,又計算一次$400,發生了重複計算。
髒讀了會從回滾段讀987賬號舊版本的$100
read committed
更新987的時候,對這一行加了排他鎖。讀到這一行的時候,必須等待提交或回滾完成,才能繼續讀下去,而等來的結果仍然可能是錯誤的(如果提交,讀到的是$400,那麼會對$400計算兩次)。
資料的寫入者阻塞資料的讀取者
由於使用多版本和讀一致性,答案總是一樣。都從回滾段去讀,並且不會被阻塞。
repetable read
同乙個查詢相對於某個時間點返回的結果是一致的
1.得到一致的答案
2.避免丟失更新
低階的共享鎖來實現,共享讀鎖防止其他會話修改我們已經讀取的資料。
上面的例子效果就是,t1時刻開始查詢,必須等待查詢完成,update才能進行。
資料的讀取者會阻塞資料的寫入者
資料的讀取者和寫入者可能而且經常會發生死鎖
多版本實現提供讀一致的答案
oracle實現讀一致性不會帶來讀寫阻塞,也不會導致死鎖。oracle永遠不會使用共享讀鎖。
serializable
多版本併發控制
多版本併發控制,討論的不是指的乙個軟體同時發行多個版本怎麼進行管理的問題,而是mysql中的mvcc。mvcc,multiple version concurrent control,多版本併發控制。可以認為mvcc是行級鎖的乙個變種,但它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不...
Oracle 的併發與多版本
oracle的預設隔離級是快照 snapshot 寫入事務不會阻塞讀取事務,讀取事務可以獲取當前已提交值。db2預設是游標穩定性 cursor stability 寫入事務會阻塞讀取事務。oracle對併發的支援不僅使用高效的鎖定,還實現了一種多版本體系結構,它提供了一種受控但高度併發的資料訪問。這...
Oracle 的併發與多版本
oracle的預設隔離級是快照 snapshot 寫入事務不會阻塞讀取事務,讀取事務可以獲取當前已提交值。db2預設是游標穩定性 cursor stability 寫入事務會阻塞讀取事務。oracle對併發的支援不僅使用高效的鎖定,還實現了一種多版本體系結構,它提供了一種受控但高度併發的資料訪問。這...