对于更新跳过,由于内部查询有时不起作用而被锁定

时间:2018-07-16 11:43:35

标签: postgresql

首先,我有3个程序处理2个表,第一次在表X中更新statusid = 1的行,并在表Y中插入有关该行的一些信息,第二次在表X中将行状态从2,3更改为1如果从时间上将其更改为2,经过20秒,而第三次只是从Y中选择一行并将其状态更改为1,则表XY表在2列上具有唯一索引,X仅用于orderid。

第一个程序查询如下所示

Update X set statusid = 2 
Where orderid in (SELECT orderid 
from X WHERE statusid = 1 LIMIT 10 FOR UPDATE SKIP LOCKED) RETURNING * --getting rows

DELETE from Y WHERE orderid = (new inserting orderid);
INsert into y (some data)

第二个

UPDATE X set statusid 1
Where oriderid in (some select ---- FOR UPDATE SKIP LOCKED)

第三

SOME selects----
UPDATE X set statusid = 3 WHERE orderid = (picked row orderid)

当同时启动3个程序时,一切工作正常,但是如果我添加与第一个程序相同的3个进程,则会出现类似Y table has unique index,....row (k,l) is inserted的错误。仅当第一个程序的两个或多个进程使用相同的行时才可能发生,但是X在唯一的orderid上具有索引,而我正在使用For UPDATE SKIP LOCKED witch来保证行将被锁定,以便其他进程无法访问那一行。另一个thime我启动了第一个编的10个进程,并且...。没有错误,但是启动3-4个进程并出现该错误的次数很多。为什么?我该怎么办?

0 个答案:

没有答案