从触发器功能更新Postgres的死锁

时间:2016-03-22 21:28:04

标签: postgresql deadlock database-trigger

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

event id (primary key)
event name
user_id (foreign key in users 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;

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

死锁意味着你有两个交易相互锁定。

了解deadlocks及其原因在手册中。

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

UPDATE users 
  SET labvar1 = NEW.name, 
      labvar1_properties = NEW.properties 
WHERE user_id = NEW.user_id
相关问题