Postgresql 使用嵌套insert避免pl/pgsql并行事务中的死锁

Postgresql 使用嵌套insert避免pl/pgsql并行事务中的死锁,postgresql,transactions,plpgsql,vk,Postgresql,Transactions,Plpgsql,Vk,我有一个pl/pgsql函数,它接收来自VK用户墙的json格式的帖子,并将数据写入表中。 此函数在40个线程中调用,如果在并行事务中出现来自copy_history部分reposts的相同帖子,则可能会发生死锁 到目前为止,我只看到两种解决方案: 卸载后删除唯一索引并删除重复行。但是如果是一张大桌子,它可能会很长,大约1亿甚至更多 将copy_history posts插入其他表中,并在卸载后合并这些表。我认为这不是一个很好的解决方案: 创建表格vk_wall id整数,从_idinteger

我有一个pl/pgsql函数,它接收来自VK用户墙的json格式的帖子,并将数据写入表中。 此函数在40个线程中调用,如果在并行事务中出现来自copy_history部分reposts的相同帖子,则可能会发生死锁

到目前为止,我只看到两种解决方案:

卸载后删除唯一索引并删除重复行。但是如果是一张大桌子,它可能会很长,大约1亿甚至更多 将copy_history posts插入其他表中,并在卸载后合并这些表。我认为这不是一个很好的解决方案: 创建表格vk_wall id整数,从_idinteger, 所有者id整数,日期整数, 后置类型文本,后置文本文本, 复制\u历史\u id整数, 复制\u历史记录\u所有者\u id整数 ; 在vk_墙所有者id、id上创建唯一索引; 创建或替换函数write_vk_wallresponse_arr jsonb 返回void作为$$ 声明arg1jsonb;声明arg2jsonb; 开始 -response_arr是一个post的json数组 对于arg1,请选择JSONB\u数组\u元素响应\u arr循环 插入vk_墙 选择 将\u转换为\u intarg1->>“id”, 将\u转换为\u intarg1->“从\u id”, 将\u转换为\u intarg1->>“所有者\u id”, 将“”转换为“”在arg1->>“日期”, arg1->>“post_type”, arg1->>“文本”, 将_转换为_intt.id, 将\u转换为\u intt.owner\u id 从jsonb_到_recordsetarg1->“复制_历史”,作为tid文本、所有者id文本 在冲突上无所作为; -“copy_history”是一个包含原始帖子的嵌套json对象。 对于arg2,请选择JSONB_数组元素arg1->“复制历史记录”循环 插入vk_墙 选择 将\u转换为\u intarg2->>“id”, 将\u转换为\u intarg2->“从\u id”, 将\u转换为\u intarg2->>“所有者\u id”, 将“”转换为“”在arg2->>“日期”, arg2->>“post_type”, arg2->>“文本”, 将_转换为_intarg2>>“{copy_history,id}”, 将_转换为_intarg2>>“{copy_history,owner_id}” 在冲突上无所作为; 端环;端环; 回来终止 $$语言plpgsql;