插入阻塞其他表格
问题描述:
我们使用Pentaho-spoon转换中的1000行事务/提交将行插入到PostgreSQL数据库中。插入阻塞其他表格
该表具有多个字段/约束作为外键,即customer_id必须存在于客户表和类似程序中。
不时我们得到了一个死锁错误...
ERROR: se ha detectado un deadlock
Detail: El proceso 29996 espera ShareLock en transacción 6643574; bloqueado por proceso 31826.
El proceso 31826 espera ShareLock en transacción 6643573; bloqueado por proceso 29996.
Hint: Vea el registro del servidor para obtener detalles de las consultas.
Where: sentencia SQL: «SELECT 1 FROM ONLY "public"."customer_table" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x»
我们没想到我们的插件,以阻止其他表。我能想象的唯一原因是要确保客户记录在交易过去的时间内不被删除。
由于我们确信没有客户记录将被删除(我们的用户无法做到这一点),有什么办法可以避免共享锁吗?
即使疗法是不是,我将不胜感激正在发生的事情:)任何光线
THKS
答
的INSERT
必须锁定customer_table
行,以确保没有人可以将其删除或修改的id
列,直到插入事务完成并且新行对每个人都可见。
它可能是UPDATE
或DELETE
上customer_table
阻止INSERT
。
我建议升级到PostgreSQL 9.3或更高版本,那么INSERT
不会采取对母排SHARE
锁,但FOR KEY SHARE
锁将不会customer_table
与UPDATE
冲突论不影响具有唯一约束的任何列。这将提高并发性并可能避免您遇到的死锁。