作者joetsai (路人酒菜)
看板java
标题[问题] 取号问题(同步问题)
时间Sun Aug 21 12:44:08 2011
小弟的系统有一需求 就是编号原则都是 年月日+三位流水号(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