刚才在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...;
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...;
所以要加锁!!!
建立一张系统表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,...);
建立一张系统表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,...);
insert into x(type,num,...) values(1,maxnum+1,...);或者索性就把表锁定,然后再做你要做的事情
我觉得使用序列完全没有问题,对于type = 1 的情况,在使用语句时使用你专门的一个序列就可以了。
insert into table(col1, col2) values(select seq_id.nextval from dual, '值');