2016-06-07 102 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中构建作业队列的好方法。