Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 存储过程不是并发的_Postgresql_Stored Procedures_Deadlock - Fatal编程技术网

Postgresql 存储过程不是并发的

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

我希望这个存储过程能够并行工作,但正如我在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 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才会等待。这是不寻常的,因为除非第一个事务中止,否则这将导致索引冲突错误

仅仅通过查看一段代码,就很难知道并发调用是否会命中相同的行,这取决于数据。但是在您的情况下,您的第一次更新似乎没有包含任何参数,这有点可疑