从触发器函数更新 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
我是 运行 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