首先,我有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个进程并出现该错误的次数很多。为什么?我该怎么办?