我正在运行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;
任何帮助表示赞赏!
答案 0 :(得分:0)
死锁意味着你有两个交易相互锁定。
了解deadlocks及其原因在手册中。
为了更新表格中的两列,您不需要运行两个单独的语句。您可以将其组合在一个语句中:
UPDATE users
SET labvar1 = NEW.name,
labvar1_properties = NEW.properties
WHERE user_id = NEW.user_id