【问题标题】:transactions in postgresql and hibernatepostgresql 和 hibernate 中的事务
【发布时间】:2016-06-07 07:37:58
【问题描述】:

我通过 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;

我为几个线程获取数据,处理它,然后从表中删除。安全吗?我应该使用“选择更新”还是其他什么?

【问题讨论】:

    标签: hibernate postgresql transactions


    【解决方案1】:

    初始 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 中构建作业队列的好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2023-04-03
      • 2016-12-17
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多