我们在Pentaho-spoon转换中使用1000行事务/提交在PostgreSQL数据库中插入行。
该表有几个字段/约束作为外键,即customer_id必须存在于customer table和similars上。
我们不时会遇到死锁错误......
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
答案 0 :(得分:0)
INSERT
必须锁定customer_table
中的行,以确保没有人可以删除它或以其他方式修改id
列,直到插入事务完成并且新行变为可见所有人。
UPDATE
上的任何DELETE
或customer_table
可阻止INSERT
。
我建议升级到PostgreSQL 9.3或更高版本,然后INSERT
不会对父行进行SHARE
锁定,而是FOR KEY SHARE
锁定不会与{{1}冲突UPDATE
上的{s}}不会影响具有唯一约束的任何列。这将改善并发性并可能避免您遇到的死锁。