从触发器函数更新 Postgres 时出现死锁

Deadlock on Update Postgres from Trigger function

我是 运行 postgres 9.4。我有一个事件 table,其中每一行代表一个具有指定用户名称的事件。

event id (primary key)
event name
user_id (foreign key in users table)

我有一个触发器功能,它检查事件的名称,如果它匹配某些名称,则将一些数据添加到用户 table 的列中以匹配 user_id.

但是,我遇到了死锁错误 - 我认为这是由于我指定函数的方式所致。谁能建议如何构造函数以避免错误?

BEGIN

IF NEW.name = 'labvar1' THEN
    UPDATE users SET labvar1=new.name WHERE new.user_id = users.user_id;
    UPDATE users SET labvar1_properties=new.properties WHERE new.user_id = users.user_id;

ELSIF NEW.name = 'labvar2' THEN
    UPDATE users SET labvar2=new.name WHERE new.user_id = users.user_id;
    UPDATE users SET labvar2_properties=new.properties WHERE new.user_id = users.user_id;

ELSIF NEW.name = 'labvar3' THEN
    UPDATE users SET labvar3=new.name WHERE new.user_id = users.user_id;
    UPDATE users SET labvar3_properties=new.properties WHERE new.user_id = users.user_id;

ELSIF NEW.name = 'labvar4' THEN
    UPDATE users SET labvar4=new.name WHERE new.user_id = users.user_id;
    UPDATE users SET labvar4_properties=new.properties WHERE new.user_id = users.user_id;

ELSIF NEW.name = 'labvar5' THEN
    UPDATE users SET labvar5=new.name WHERE new.user_id = users.user_id;
    UPDATE users SET labvar5_properties=new.properties WHERE new.user_id = users.user_id;

ELSE
RETURN null;
END IF;
RETURN NEW;
END;

感谢任何帮助!

死锁意味着您有两个事务相互锁定。

在手册中阅读有关 deadlocks 的内容以及为什么会这样。


为了更新 table 中的两列,您不需要 运行 两个单独的语句。您可以像这样将其组合在一个语句中:

UPDATE users 
  SET labvar1 = NEW.name, 
      labvar1_properties = NEW.properties 
WHERE user_id = NEW.user_id