2016-03-22 13 views
0

私はpostgres 9.4を実行しています。私は各行が指定されたユーザーの名前を持つイベントを表すイベントテーブルを持っています。更新時のデッドロック更新時のPostgres関数

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

デッドロックとは、2つのトランザクションを互いにロックしていることを意味します。

deadlocksについて読んでください、なぜそれがマニュアルで起こっているのですか?


テーブルの2つの列を更新するには、2つの個別のステートメントを実行する必要はありません。これを次のような文で組み合わせることができます。

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

ありがとうございます。私は、イベントごとにif/end ifブロックを分割してデッドロックを解決しました。 – theyletmehavecontrol

関連する問題