2

我有function其中checksmaximum valuepid然后inserts进入数据库。

但它提高了conflict我有一段时间concurrent transactions!

那么我该如何避免这种冲突!

create table tablea(
  sno serial,
  pid integer,
  ppid integer,
  pname text
  );

--这是检查pid的最大值然后插入数据库的函数。

CREATE OR REPLACE FUNCTION insert_details(_pname text)
RETURNS void AS
$BODY$
declare
    _pid int;
begin
   _pid := (select MAX(pid) from tablea);
   _pid := coalesce(_pid, 0) + 1;

   insert into tablea(pid,pname)
   values(_pid,_pname);
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

--(Sub Party)This is the function checks the maximum value of ppid and then inserts into the database.(sub-Party)

CREATE OR REPLACE FUNCTION insert_details(_pid int,_pname text)
RETURNS void AS
$BODY$
declare
        _ppid int;
begin
   _ppid := (select MAX(ppid) from tablea where pid=_pid);
   _ppid := coalesce(_ppid, 0) + 1;

   insert into tablea(pid,ppid,pname)
   values (_pid,_ppid,_pname);
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

我的要求:当我submit从前端点击一个按钮时,我field(pname)应该被插入到tablea,通过增加pid by +1,所以我不能从 tablea 中删除我的 pid,并且 pid 保持整数,以便我可以通过相同的 pid 插入另一条记录& 流程也和 ppid 一样..

所以我应该改变我的表结构还是任何其他方式来纠正并发事务中的冲突。

这就是我的整个概念的全部内容 sql fiddle demo

4

2 回答 2

1

永久有效地避免冲突的方法是从表中删除冗余。pidsno改为用于所有目的。并且不允许直接输入该列,因此无法绕过附加序列中的默认值。sno可能有差距,这是设计使然。但它对于并发负载下的独特列来说完美无缺。之后的请求(稍后开始)会获得更高的序列号。这就是serial专栏的好处。

如果你真的需要一个无缝的“pid”,你可以模拟一个row_number()

SELECT *, row_number() OVER (ORDER BY sno) AS pid FROM tablea

现在,如果可以删除行,则合成pid不稳定。但是,如果编号中可能存在空白,那么这个练习的意义何在?

于 2013-08-29T00:14:07.300 回答
0

尝试这样的事情来减少冲突的机会:

insert into tablea(pid,pname)
values(coalesce((select MAX(pid) from tablea), 0) + 1,_pname);

为了完全避免冲突,您还可以将事务隔离级别设置为可序列化(首先阅读它以考虑利弊):

set transaction isolation level serializable;

insert into tablea(pid,pname)
values(coalesce((select MAX(pid) from tablea), 0) + 1,_pname);
于 2013-08-28T18:41:36.170 回答