Postgresql 存储过程不是并发的
我希望这个存储过程能够并行工作,但正如我在PgAdmin中看到的那样,它不能并行工作。一个进程被另一个进程阻塞(等待他完成)。在我看来,更新查询在并发运行时没有问题。这都是关于插入的,对吗?我试图在更新查询上设置行共享独占锁,但已陷入死锁Postgresql 存储过程不是并发的,postgresql,stored-procedures,deadlock,Postgresql,Stored Procedures,Deadlock,我希望这个存储过程能够并行工作,但正如我在PgAdmin中看到的那样,它不能并行工作。一个进程被另一个进程阻塞(等待他完成)。在我看来,更新查询在并发运行时没有问题。这都是关于插入的,对吗?我试图在更新查询上设置行共享独占锁,但已陷入死锁 UPDATE product p SET category_id = m.internal_category_id, category_from=m.cat_prior FROM main_table m WHERE p.mpn=m.mpn
UPDATE product p SET category_id = m.internal_category_id, category_from=m.cat_prior FROM main_table m
WHERE p.mpn=m.mpn AND
p.vendor_id = m.internal_vendor_id AND
m.new_prod=false and
m.internal_category_id IS NOT NULL AND
(category_from is null or category_from<=m.cat_prior);
INSERT INTO product(vendor_id, category_id, mpn, name, category_from)
SELECT DISTINCT ON(m.mpn, m.internal_vendor_id) m.internal_vendor_id, m.internal_category_id, m.mpn, m.prod_name, m.cat_prior
FROM main_table m
LEFT OUTER JOIN product ON product.mpn=m.mpn AND product.vendor_id=m.internal_vendor_id
WHERE m.new_prod='1' AND m.internal_vendor_id IS NOT NULL
AND product.mpn IS NULL;
UPDATE main_table m SET internal_product_id = p.id
FROM product p
WHERE p.mpn=m.mpn AND p.vendor_id = m.internal_vendor_id ;
UPDATE vendor SET has_products = true FROM (SELECT DISTINCT v.id as id FROM vendor v INNER JOIN product p ON p.vendor_id = v.id) AS r WHERE vendor.id = r.id;
UPDATE vendor SET has_products = false FROM (SELECT DISTINCT v.id as id FROM vendor v LEFT JOIN product p ON p.vendor_id = v.id WHERE p.vendor_id IS NULL) AS r WHERE vendor.id = r.id;
更新产品p集合category\u id=m.internal\u category\u id,category\u from=m.cat\u prior from main\u table m
其中p.mpn=m.mpn和
p、 供应商id=m.内部供应商id和
m、 new_prod=false和
m、 内部\u类别\u id不为NULL,并且
(category_from为null或category_from在我看来,更新查询在运行时没有问题
同时。所以这都是关于插入的,对吗
两者都可能有问题,但更新在联锁方面的问题更大
当一个更新修改一行,而另一个更新尝试修改同一行时,第二个更新将等待第一个事务提交或回滚
另一方面,当两个insert命中同一个表时,只有当表上有唯一索引并且两个语句都试图插入相同的索引值时,第二个insert才会等待。这是不寻常的,因为除非第一个事务中止,否则这将导致索引冲突错误
仅仅通过查看一段代码,就很难知道并发调用是否会命中相同的行,这取决于数据。但是在您的情况下,您的第一次更新似乎没有包含任何参数,这有点可疑