小弟的系統有一需求 就是編號原則都是 年月日+三位流水號(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