現象描述
專案採 DB2 嵌入式 C 開發,為節省資源每兩人共用一個 DB 實例。開發人員 A 編譯執行後,開發人員 B 同實例編譯執行,A 隨即報錯:
SQL0818N A timestamp conflict occurred.
雙方輪流重新預編譯/執行,錯誤交替出現,嚴重阻礙開發。
根本原因:套件一致性 Token (Timestamp) 機制
DB2 為確保應用程式與資料庫套件版本一致,採用一致性標記 (Consistency Token / Timestamp) 機制:
- 預編譯時,DB2 在修改後的原始檔 (`.c`/`.sqc`) 嵌入一致性標記,並在系統目錄套件資訊中儲存相同值。
- 執行時,每條 SQL 請求攜帶此標記,DB2 比對目錄值。
- 若兩值不符,且載入模組的時間戳與一致性標記不符,拋出 SQLCODE -818 (Timestamp Conflict)。
衝突情境還原
- 開發人員 A 預編譯 → 產生套件 P_A、嵌入 Token T_A。
- 開發人員 B 預編譯 → 產生套件 P_B、嵌入 Token T_B (覆蓋系統目錄同名套件)。
- A 執行舊模組 (Token T_A) → 比對目錄現為 T_B → 不符 → -818。
- B 執行同理。
解決方案
- 獨立資料庫實例:每位開發人員專用 DB 實例 (最徹底)。
- 獨立 Schema/Collection:預編譯指定不同
COLLECTION (如 `db2 prep ... COLLECTION DEV_A`),套件隔離不互相覆蓋。
- 同步編譯流程:團隊約定同一時間只能有一人對共用實例進行預編譯/綁定。
- 使用版本控制 + CI:統一建置流程產生套件,部署至共用實例,開發端僅執行不重新預編譯。
補充說明
DB2 套件 (Package) 是 SQL 陳述式的編譯後執行計畫容器。一致性標記預設為時間戳,也可指定為版本號 (`VERSION`)。理解此機制對團隊協作開發至關重要。