插入阻止其他表

时间:2016-07-15 09:46:56

标签: postgresql pentaho-spoon

我们在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

1 个答案:

答案 0 :(得分:0)

INSERT必须锁定customer_table中的行,以确保没有人可以删除它或以其他方式修改id列,直到插入事务完成并且新行变为可见所有人。

UPDATE上的任何DELETEcustomer_table可阻止INSERT

我建议升级到PostgreSQL 9.3或更高版本,然后INSERT不会对父行进行SHARE锁定,而是FOR KEY SHARE锁定不会与{{1}冲突UPDATE上的{s}}不会影响具有唯一约束的任何列。这将改善并发性并可能避免您遇到的死锁。