看板 java 關於我們 聯絡資訊
小弟的系統有一需求 就是編號原則都是 年月日+三位流水號(001開始) 資料庫為 Oracle 10g 由於有 Load Balance 多台AP 所以Java本身的synchronized的modifier無效 由於每日編號都要重編 所以不能用Sequence 所以每次這樣的需求 都會採用 Insert 的 Table Lock 進行實做 會先開啟一個 DB Lock 的 Table 只有一個欄位 那欄位即為PK 當然 DB 的 Isolation Level 為 2 以上 (Read committed) 取號程式大致如下: 1. 設Connection的Autocommit屬性為false 2. 塞入固定值入 DB Lock 的 Table 然後 刪除 3. 取得今日編號的最大號碼 若有則+1 若無則從001開始 4. 新增一筆編號紀錄 5. Commit 由於DB的Lock機制 所以有多個User同時存取時 會停留在第2點 保証同一時間點內 取號不會重複 小弟我查過下面的文章 看起來這機制應該是沒問題的 http://download.oracle.com/docs/cd/B14117_01/server.101/b10743/consist.htm 可是有兩個問題想請教板上的高手: 1. 不知道這樣的作法 是否有風險 如網路瞬斷 會不會導致整個取號Method出問題 2. 不知道有沒有其他作法 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.184.25.55