当前位置: 首页 > 知识库问答 >
问题:

Postgres 写/读锁定

彭阳朔
2023-03-14

我有一个多线程的JEE应用程序,运行选择更新限制1;使用WHERE子句对表进行查询,并在每个事务中更新行,这将创建行级写锁,并且不会阻止读取器进行读取。

有什么方法可以配置postgres,来阻止读者用写锁读取行?

共有2个答案

慕容越泽
2023-03-14

如果你是流浪者,这里有一个选项给你

DO $$
DECLARE 
    r RECORD;
    ... -- your variables 
BEGIN
    FOR r IN 
        SELECT some_id
          FROM some_table
         WHERE ... -- your conditions
         ORDER BY ... -- your ordering
         LIMIT ... -- your limit
    LOOP 
        BEGIN 
            SELECT ... -- your needed column(s)
              INTO ... -- your defined variable(s)
              FROM some_table -- the same table
             WHERE some_id = r.some_id -- only check this one record
               FOR UPDATE NOWAIT; -- don't wait for parallel transactions
            EXIT;
        EXCEPTION WHEN lock_not_available THEN 
            CONTINUE;
        END;
    END LOOP;
    ... -- do something based on variables, or move this before the EXIT above
END;
$$ LANGUAGE plpgsql;
高勇
2023-03-14

在postgres 9.5中,有< code >跳过锁定选项:

如果您需要从表中进行选择,并在事务完成之前防止这些行被更新,您可以指定FOR UPDATE,但是如果某些行被锁定,您可以指定SKIP LOCKED,告诉它忽略这些行,只对它可以访问的任何行执行操作。

https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#跳过锁定

 类似资料:
  • 9.3. sync.RWMutex读写锁 在100刀的存款消失时不做记录多少还是会让我们有一些恐慌,Bob写了一个程序,每秒运行几百次来检查他的银行余额。他会在家,在工作中,甚至会在他的手机上来运行这个程序。银行注意到这些陡增的流量使得存款和取款有了延时,因为所有的余额查询请求是顺序执行的,这样会互斥地获得锁,并且会暂时阻止其它的goroutine运行。 由于Balance函数只需要读取变量的状态

  • Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor

  • 我正在深入研究 java 并发 API,并试图了解读写锁的有用性。javadoc说读写块维护一对锁,一个用于读取,另一个用于写入操作。虽然写锁定是线程的独占访问,但多个线程可以获取读锁定。因此,如果在读取部分,我们所做的只是读取操作,并且无论如何我们都提供多个线程访问,那么首先需要读锁吗?是否存在读写锁实际上有用的情况?

  • 我有一个类似于聊天轮盘的应用程序,其中用户是随机匹配的。我在数据库级别通过将两个用户与 匹配来执行此操作 然而,如果用户A正在等待,而用户B和C同时继续,这就容易受到攻击。 有没有办法锁定记录,以便在进行查询时无法读取它?就像如果用户 B 首先进行 查询(这将返回用户 A),我希望相同的查询不为用户 C 返回任何内容。 我在看这个:https://www . PostgreSQL . org/do

  • 我的应用程序收到大量传入的 HTTP 请求。在每个请求的标头中,都有一个键值对。 说出标题1=应用程序1 值App1不断变化。 所以接下来它可以是App2、App3等等。 .但是,这些值可以按任何顺序继续出现。我需要处理竞争条件,其中如果出现 App1 的多个请求,我获得 reentrantreadwritellock 在App1上。同时,如果我收到对App2的请求,我将获取App2的重入读写锁。

  • 本文向大家介绍python版本的读写锁操作方法,包括了python版本的读写锁操作方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python版本的读写锁操作方法。分享给大家供大家参考,具体如下: 最近要用到读写锁的机制,但是python2.7的自带库里居然木有. 网上讲读写锁的例子众多,但是原理简单,代码明晰的却不多见, 索性自己写个. 读写锁一般用于多个读者,1个或多个写者同时访问