[英]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.