【发布时间】:2015-01-16 09:38:27
【问题描述】:
我们有一个没有对任何其他表的引用的表。
┬────────────┬─────────────┬───────────────┬───────────────╮
│id_A(bigint)│id_B(bigint) │val_1(varchar) │val_2(varchar) │
╪════════════╪═════════════╪═══════════════╪═══════════════╡
表的主键是 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)
我们遇到了死锁,我们所有使用锁(使用SELECT FOR UPDATE 的行级和表级锁)执行操作的尝试似乎都不能解决这些死锁问题。 (请注意,由于性能影响,我们不能以任何方式对该表使用访问排他锁定)
还有其他方法可以尝试解决这些死锁情况吗? The reference manual says:
防止死锁的最佳方法通常是通过以下方式避免死锁 确保所有使用数据库的应用程序都获得锁定 多个对象以一致的顺序。
但是在上述情况下我们如何实现这一点。是否有保证以特定顺序进行批量更新插入操作的方法?
【问题讨论】:
标签: database postgresql concurrency deadlock database-deadlocks