現在有這樣的環境:
一台web Server,一個是純JAVA APP 程式
資料庫兩台做成RAC的形式。 web Server與APP 程式都通過oci(rac)的方式串連
資料庫。
出了這樣的怪問題,webServer更新或是插圖入一條資料,後面緊跟著的在APP中就查詢不到,等到用工具查詢就沒有問題.
初步懷疑
1. RAC方式下面的資料庫兩個instance的同步沒做好?
查詢相關資料發現在與MAX_COMMIT_PROPAGATION_DELAY有關.
最大提交傳播時延(MAX_COMMIT_PROPAGATION_DELAY,簡稱MCPD),在ORACLE RAC(或OPS)環境中才使用,表示在RAC系統中,一個instance系統提交產生的最新系統改變碼(SCN),能夠以多快的速度反應到另一個instance中。
舉例說明,RAC系統,有A,B兩個執行個體(instance),A、B本地系統改變碼為SCN1,A更新資料DATA1提交, LGWR操作完成後,A本地系統改變碼為SCN2,經過不大於MAX_COMMIT_PROPAGATION_DELAY時間後,B系統本地改變碼才變為SCN2。
Global Cache Services 將重新整理RAC中的SCN。不管SCN是否及時重新整理,後續的資料查詢都不會因此產生資料庫錯誤。但,在此時間內,有可能查詢結果不是最新資料,產生讀一致性(read consistency)問題。
RAC環境中的所有執行個體,此參數值必須相同。
ORACLE8i後,建議常用的兩個值是0和700(預設),其他數值皆不建議。其實,這兩個數值就代表了RAC環境中,兩種SCN 產生機制:
Lamport Scheme和 Broadcast on Commit scheme。
設定為預設值700,表示採用Lamport Scheme,SCN改變不會完全同步,同步將在 7秒鐘內完成,而不是總等待7秒鐘後才完成。如果系統比較空閑,同步可能在0.5秒(甚至更短時間)內完成;不管系統多繁忙,同步時間也不可能超過7秒。不難理解,採用此模式,整個RAC系統的運行效率較高。
設定為0,表示採用Broadcast on Commit scheme,SCN改變完全同步。每當commit時(即LGWR 寫redo log時):
- LGWR發送訊息更新全域SCN(global SCN),
- LGWR 發送訊息給每個活動的執行個體更新其本地SCN(local SCN)。
有資料說,只要MCPD < 700,系統將採用Broadcast on Commit scheme。
Lamport Scheme能夠適應絕大部分應用的要求,只有個別即時性特別高的業務,才需要Broadcast on Commit scheme。通過分析,不難理解,Broadcast on Commit scheme將需要更多的系統資源