相关疑难解决方法(0)

执行批量更新和删除操作时避免PostgreSQL死锁

我们有一个表没有任何其他表的引用.

????????????????????????????????????????????????????????????
?id_A(bigint)?id_B(bigint) ?val_1(varchar) ?val_2(varchar) ?
????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

表的主键是id_A和id_B的组合.

该表的读写是高度并发的,表有数百万行.我们有几个存储过程可以进行批量更新和删除.这些存储过程主要由触发器和应用程序代码同时调用.

这些操作通常如下所示,它可以匹配数千条记录来更新/删除:

DELETE FROM table_name 
WHERE id_A = ANY(array_of_id_A)
AND id_B = ANY(array_of_id_B)

UPDATE table_name
SET val_1 = 'some value', val_2 = 'some value'
WHERE id_A = ANY(array_of_id_A)
AND id_B = ANY(array_of_id_B)
Run Code Online (Sandbox Code Playgroud)

我们遇到了死锁,我们使用锁(行级使用SELECT FOR UPDATE和表级锁)执行操作的所有尝试似乎都无法解决这些死锁问题.(注意,由于性能影响,我们不能以任何方式在此表上使用访问独占锁定)

还有另一种方法可以尝试解决这些死锁情况吗?参考手册说:

防止死锁的最佳方法通常是通过确保使用数据库的所有应用程序以一致的顺序获取多个对象的锁来避免死锁.

但是我们怎样才能在上述场景中实现这一目标.是否有保证以特定顺序执行批量更新插入操作的方法?

database postgresql concurrency deadlock database-deadlocks

14
推荐指数
1
解决办法
5511
查看次数