日期:2014-05-16  浏览次数:21283 次

Oracle自定义序列号生成时的并发操作问题
Oracle自定义序列号生成时的并发操作问题
某流水帐表序列号生成时带有一定规则,如:四位的年份+4位数字的序号20120001,20120002,...
我是每次查询该表取最大值,然后+1,一般来说没有什么问题,可是一旦多人同时并发操作时,例如也许有两个人查

询表时,表中最大序号都为20120002,那么下一个最大值都会插入20120003的情况,即有可能得到的流水帐号相同,

如何解决这种并发操作而不重号问题?
------解决方案--------------------
用序列,cache设置大点。
------解决方案--------------------
-- Create sequence 
create sequence SEQ_XXX
minvalue 20120001
maxvalue 999999999999
start with 20120001
increment by 1
nocache;

------解决方案--------------------
序列是最快捷的解决并发和重号的方法。
------解决方案--------------------
你可以用锁把它lock住啊。。。当你在这张表的时候,锁住,你用完之后释放。。。
------解决方案--------------------
begin trans;
select 序号 from 表 where 部门 = 'A' for update;
execute your othe query;
update 表 set 序号 = <new value> where ...;
commit;
------解决方案--------------------
rownum+1也行
序列也行,不过在事务失败时会跳号