繁体   English   中英

PostgreSQL和休眠中的事务

[英]transactions in postgresql and hibernate

我通过Hiberante的几个线程将此Postgres函数称为:

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;

我得到几个线程的数据,进行处理,然后从表中删除。 安全吗? 我应该使用“选择更新”还是其他?

初始的UPDATE语句将锁定行。 如果有可能希望锁定其他记录(除了那些影响了UPDATE的记录),则将SELECT转换为SELECT FOR UPDATE会很好。

请注意,PostgreSQL中的锁一旦获得便会保留,直到事务完成。 无需“重新锁定”任何记录。 此外,您应始终尝试避免“锁升级”,在这种情况下,您将获得重量较小的锁,然后在以后尝试获得重量较大的锁。 这往往会导致出现死锁情况。

对于这种特殊类型的查询,您可能希望研究的是PostgreSQL的“ SKIP LOCKED”功能,您可以在此处阅读以下内容:

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

此功能使您可以从单个表中查询多个工作进程,每个工作进程都可以获取下一个未锁定行的内容(然后将其锁定为一个步骤); 这是在PostgreSQL中建立作业队列的好方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM