我们有一张单独的表格,没有引用任何其他表格。
┬────────────┬─────────────┬───────────────┬───────────────╮
│id_A(bigint)│id_B(bigint) │val_1(varchar) │val_2(varchar) │
╪════════════╪═════════════╪═══════════════╪═══════════════╡
id_A | id_B | value |
---|---|---|
1 | a | old_value_1a |
2 | b | old_value_2b |
3 | c | old_value_3c |
... | ... | ... |
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和表级锁定进行行级锁定),但这些都似乎无法解决死锁问题。(请注意,由于性能影响,我们无法以任何方式在此表上使用访问排他锁定)
除了上述方法,是否有其他方法可以尝试解决这些死锁情况?参考手册中提到:
通常避免死锁的最佳方法是确保所有使用数据库的应用程序都以一致的顺序获取多个对象的锁定。
但在上述情况下,我们如何实现这一点呢?是否有一种可靠的方法来按特定顺序执行批量更新插入操作?