ORACLE一致讀與ORA-01555

ORACLE一致讀與ORA-01555 code

用戶user1對錶進行了更新操做,用戶user2在user1尚未進行提交前讀表中數據,並且是大批量的讀取(打個比方:耗時3分鐘)而在這3分鐘內user1進行了提交操做,那又會產生什麼影響呢?這個時候怎麼保證讀寫一致性呢?這個時候DBMS就要保證有足夠大的undo表空間來存放修改前的數值,,以保證user2讀取的數據是修改前的一致數據.而後下次再讀取時候就是更新後的數據了.
ora-01555快照過舊就是由於undo空間不夠大,其中一部分undo數據被覆蓋了,用戶沒法得到修改前的數據。
undo數據分爲三種:
活動的undo:未提交事務的undo數據,這些undo數據永遠不能覆蓋,用於回滾rollback事務。
過時的undo:已提交事務的undo數據,這些undo數據能夠覆蓋。
未過時的undo:事務已提交,但事務提交前,有些查詢正在進行,它要讀取的是提交前的數據,這部分數據就是未過時數據。若是這部分undo數據被覆蓋了,就會發生ora-01555錯誤。

一個解決方法是,指定undo表空間參數UNDO_TABLESPACE,並將undo空間管理方法設置成自動擴展:UNDO_MANAGEMENT=AUTO。
這種方法可能產生的結果是:
由於undo表空間裝了太多未過時(unexpired)的undo數據,新的transaction沒法向其中寫入undo數據,這時transaction就會發生ORA-30036錯誤。
相關文章
相關標籤/搜索