2016-06-07 162 views
0

我打電話從幾個線程這Postgres的功能通過的Hiberante:交易和休眠

UPDATE table SET active = _active 
    WHERE id IN (
      SELECT id FROM table 
      WHERE active = 0 ORDER BY id LIMIT 5); 

    SELECT count('PK') INTO cnt FROM table WHERE active = _active; 

    IF(cnt > 0)THEN 
      FOR ret IN 
        SELECT * FROM table WHERE active = _active 
        LOOP 
        RETURN NEXT ret; 
      END LOOP; 
END IF; 

我得到的數據的線程數,處理它,之後從表中刪除。它安全嗎?我應該使用「選擇更新」還是其他?

回答

1

初始UPDATE語句將鎖定行。如果可能存在您希望鎖定更新的其他記錄(除了影響UPDATE的那些記錄),將SELECT轉換爲SELECT FOR UPDATE會很好。

請注意,PostgreSQL中的鎖一旦被獲取,一直保持到事務完成;沒有必要「重新鎖定」任何記錄。此外,你應該總是儘量避免'鎖升級',這是你採取較低重量的鎖,然後嘗試獲得較高重量的鎖。這往往會導致死鎖情況。

什麼,你可能希望探討這種特殊類型的查詢是PostgreSQL的「SKIP已鎖定」功能,你可以讀到這裏:

http://michael.otacoo.com/postgresql-2/postgres-9-5-feature-highlight-skip-locked-row-level/

此功能可以讓你有多個工作進程從單個表格中查詢,每個表格抓取下一個解鎖的行(然後鎖定它,一步);這是在PostgreSQL中構建作業隊列的好方法。