刚才在Postgre版问没有人回答,所以转到这里来了,
Postgre和ORACLE其实很象的,也是ORDBMS我有一个这样的表:
create table x (id serial PRIMARY KEY, type int, num int, ....)
我现在要求,对于type = 1的记录里,num是123456这样顺序向后数的但我不知道该怎么做才能防止冲突,比如,我要是这样做:
maxnum = select MAX(num) from x where type=1;
insert into x(type,num,...) values(1,maxnum+1,...);
要是有人在我执行了第一条语句之后执行了另一个INSERT,
我写进去的东西就有问题了O'Neil的书上说这个问题是叫做Ri(A)->Wj(A)类型,
如果用事物来做的话好象是只有Serializable级才能解决
但Postgre缺省的是Read Committed级是不是要加什么锁?
还有,顺便问一下,是不是一条SQL语句总是被完整的执行的?
比如这样一条语句:insert into ... select ...;
会不会出现这样的执行序列:
select ...;
别的进程做一些操作;
inset into...;

解决方案 »

  1.   

    因为insert 语句对旧的记录不加锁,所以 insert into ... select...也不大保险。
    所以要加锁!!!
      

  2.   

    可以这样做:方案一
    建立一张系统表A存放表X当type=1时的最大值加一每次插入取A表的值,取完后更新A表的值为A表的值加一,如果成功的话再做X表插入操作方案二:
    select MAX(num) from x where type=1 for updatecommit;insert into x(type,num,...) values(1,maxnum+1,...);
      

  3.   

    可以这样做:方案一
    建立一张系统表A存放表X当type=1时的最大值加一每次插入取A表的值,取完后更新A表的值为A表的值加一,如果成功的话再做X表插入操作方案二:
    select MAX(num) from x where type=1 for updatecommit;insert into x(type,num,...) values(1,maxnum+1,...);
      

  4.   

    select MAX(num) from x where type=1 for update;
    insert into x(type,num,...) values(1,maxnum+1,...);或者索性就把表锁定,然后再做你要做的事情
      

  5.   

    oracle 的sequence是不是可以解决这个问题?
      

  6.   

    为什么不使用序列?????
    我觉得使用序列完全没有问题,对于type = 1 的情况,在使用语句时使用你专门的一个序列就可以了。
    insert into table(col1, col2) values(select seq_id.nextval from dual, '值');