update test set x=1 where y=1;
delete from test where y=1;
它是分為兩步:
1. 根據where條件找出表中滿足更新條件的資料行;
2. 更新步驟1中所找出的資料行的x值。
假如test表很大,update要執行好幾分鐘,而且在步驟1期間有人將某一行的y值改為2並提交了,那麼在步驟2中,這個y=2的行是否還會被更新x列呢?
這種情況下,oracle會選擇「重啟動」更新。
其實,oracle在執行dml語句時,會用到兩種不同的方式去讀取資料塊:
1. 一致讀:在「找到」需要修改的資料行時,會採用consistent read
2. 當前讀:在「獲取」資料塊來實際更新資料行時,會採用current read
oracle就是通過這樣來判斷是否需要重啟動的。
具體到上面的例子中,首先oracle會利用一致讀找到所有y=1的資料行,因此就算讀取期間有別的會話修改了某一行的y值(如從y=1變為y=2),oracle也會利用undo資料將該行的y列恢復到讀取的那個時刻的值(即y=1),所以這一行還是會被讀取。然後,當要實際更新這一行的時候,oracle會利用當前讀去獲取資料塊的最新版本,由於被提交過了,所以讀到的y值是2,與之前一致讀中的y=1不符。所以oracle就知道了需要「重啟動」這個update操作。
oracle重啟動的流程:
1. 回滾之前的修改操作
2. 進入select for update模式,鎖定需要修改的行
3. 對鎖定的行進行修改操作
(這個流程是指在oracle預設的read commited隔離級別下,如果是serializable模式,則會出現ora-08177錯誤)
Oracle語句重啟動原理
sql update test set x 1 where y 1 delete from test where y 1 它是分為兩步 1.根據where條件找出表中滿足更新條件的資料行 2.更新步驟1中所找出的資料行的x值。假如test表很大,update要執行好幾分鐘,而且在步驟1期間有人將某一...
vista xp linux多重啟動
ubuntu與xp或vista多啟動問題 ubuntu與xp或vista多啟動問題 a,如果是xp vista 與ubuntu之間,先裝xp,後裝ubuntu,ubuntu會在grub中加入xp啟動項。可以手動新增 對應xp,vista,2003的 title microsoft windows x...
mssql與mysql定時重啟動
採用at命令新增計畫任務。有關使用語法可以到window 開始 執行 cmd 執行命令 at 這樣介面中就會顯示at命令的語法。下面我們講解下如何讓伺服器定時啟動apache與mysql 複製 如下 echo off net stop apache2 net start apache2 net st...