2008-12-17 48 views

回答

7

存儲值存儲在SYSTEM.SEQ $(我認爲)表中,緩存保存在下一個要使用的值的內存中,該緩存的大小取決於CACHE值序列。

當緩存耗盡時,SEQ $表被更新爲新值(以不一致的方式 - 即沒有用戶會話的Transacton控制應用),接下來說100個值(如果CACHE = 100)從內存中讀取。

假設您正在使用緩存大小爲20的序列。當您從序列中選擇某個值(比如說1400)時,SEQ $表會更新爲值1420.即使您回滾了事務中,SEQ $仍然具有該值,直到使用了接下來的20個序列值,此時SEQ $被更新爲1440.如果您剛剛使用了值1423併發生實例崩潰,那麼當系統重新啓動下一個值從後續讀取將是1440.

所以,是的序列完整性將被保留,數字將不會被「重新發布」。請注意,這同樣適用於正常關機 - 當您重新啓動時,您將在上面的示例中獲得1440的新值。由於這個原因,序列在實踐中不保證沒有間隙(也是因爲使用一個值然後回滾不會將該值恢復到緩存)。

2

不是我對此有任何經驗,但我非常認爲恢復到一致的系統更改編號狀態也會將序列返回到上次保存的狀態。在恢復方面,其他任何東西都是毫無用處的。

對於緩存值,即使實例以有序方式關閉(*),它們也(可能)丟失:實例將大量序列值緩存到內存(SGA)中,而不是每次都去數據庫。實例已保留的未使用的序列值可能「消失」,從而在序列中留下缺口。 (*)8i文檔提到這可能發生在並行實例(RAC)中,在這種情況下,序列甚至可能不是嚴格遞增的(但仍然是唯一的),10g文檔說它發生在實例故障的情況下。