2011-09-23 50 views
4

我很困惑。我正在閱讀有關Oracle中的MVCC。我認爲MVCC意味着沒有鎖。但是,我讀到其他地方,無論隔離級別如何,所有UPDATE都會自動鎖定。有人可以解釋Oracle更新期間會發生什麼嗎?當多個讀提交事務嘗試執行併發時會發生什麼update t set c = c + 1 where id = 3。結果是什麼,在任一交易之前給定c = 1,以及鎖和SCN發生了什麼?Oracle中的併發更新:是否鎖定?

Begin T1 
Begin T2 
T1: update t set c = c + 1 where id = 3 
T2: update t set c = c + 1 where id = 3 
Commit T1 
Commit T2 

回答

6

你是對的,無論隔離級別如何,這都會鎖定行。使用MVCC,您可以獲得一致的讀取而無需鎖定,但寫入時仍然需要鎖定。

在嘗試做任何事情之前,第二筆交易將等待第一筆交易完成(例如:COMMITROLLBACK)。所以在這種情況下,T2上的光標會「掛起」更新,等待T1完成。

你會在T1提交之後得到一個新的SCN,而在T2提交之後會得到一個新的SCN。

+0

謝謝。所以,MVCC意味着這個鎖不會影響讀取,但是,對嗎?只是其他寫入同一記錄,其中id = 3? –

+0

@RonGarrity是。 Oracle可以使用撤銷日誌爲連接到它的所有會話提供數據庫的讀取一致視圖。 – NullUserException