我有一个简单的用例,当在子表中插入/删除一行时,我更新父表。
假设我们有一个Products表和Items表,ProductId是 Items 表中的外键。
每当在Items表中插入或删除项目时,都会在与该项目对应的 Products 表中进行更新。更新只是一个查询,如:
UPDATE "Products" SET "PropertyX" = $1, "UpdatedAt" = $2 WHERE "Id" = $3
问题:
如果在 items 表中插入/删除的项目对应于 products 表中的相同产品,那么数据库负载会显着增加,导致由于Lock:transactionid等待而导致超时,即使是 3K reqs/min。
我在 Aurora Postgres(具有 4 个 CPU,16G Ram)上对此进行了测试,即使 Items 表中的行数为数千且 Products 表中的行数为数百,也会发生这种情况。我将.net core 与实体框架一起使用。
"Products"
我的建议是在修改表时使用“延迟约束触发器”来更新表"Items"
。此类触发器
AFTER
不是在语句之后立即运行,而是在事务结束时运行的触发器。这里的优点是行
"Products"
不会被锁定超过必要的时间,并且您的并发性会好得多。