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

Postgres:如何防止使用显式锁读取?

贡念
2023-03-14

我有一个类似于聊天轮盘的应用程序,其中用户是随机匹配的。我在数据库级别通过将两个用户与 user.look == true 匹配来执行此操作

然而,如果用户A正在等待,而用户B和C同时继续,这就容易受到攻击。

有没有办法锁定记录,以便在进行查询时无法读取它?就像如果用户 B 首先进行 SELECT * FROM 用户 WHERE looking=true 查询(这将返回用户 A),我希望相同的查询不为用户 C 返回任何内容。

我在看这个:https://www . PostgreSQL . org/docs/9.1/static/explicit-locking . html但是行级锁看起来不像是对读取有效?

除了表级锁之外,还有行级锁,可以是独占锁或共享锁。更新或删除特定行时,会自动获取该行的排他行级锁。锁一直保持到事务提交或回滚,就像表级锁一样。行级锁不影响数据查询;它们只阻止同一行的写入程序。

基本上我需要一种方法来

1) 查阅记录

2)更新它

而不会有另一个线程找到相同记录的风险。

共有1个答案

聂季同
2023-03-14

>

  • 如果A B C同时进行查询,并且您希望只有一个用户可以像用户一样获得记录。looking==true,只需更新记录,pg实际上会在这里执行三个步骤

    • 开始;
    • 更新记录
    • 犯;

    假设A进行更新,B想要同时更新记录,B将在更新记录步骤中阻塞。看起来像是A锁定了记录,实际上MVCC阻止了来自B的更新。用ROW EXCLUSVE锁更新锁表,并且ROW EXCLUSVE不会阻止ROW EXCLUSVE锁。

    当A B同时更新时:

    此处示例1

    此处的示例2

  •  类似资料:
    • 问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问

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

    • 本文向大家介绍怎么防止死锁?相关面试题,主要包含被问及怎么防止死锁?时的应答技巧和注意事项,需要的朋友参考一下 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。 尽量使用 Java. util. concurrent 并发类代替自己手写锁。 尽量

    • 问题内容: 我对* nix系统上的POSIX Pthreads中的读写锁定有一些疑问,例如Linux。 我想知道读写锁定的默认偏差是什么,即,它优先于读取而不是写入,反之亦然?它是否提供一些api来更改此默认行为。 posix pthread是否提供一些api,以便我们可以更改pthread_rwlock_t来防止作者饥饿?从我所阅读的内容(如果我错了,请纠正我),默认实现偏向于读者线程,因此作家

    • 问题内容: 我试图了解如何创建查询以基于内部联接过滤掉一些结果。 考虑以下数据: 我想选择project_id为1的所有composition_batch记录,并具有component_id为1或2的composition_batch_component。因此,我运行以下查询: 但是,这将返回重复的条目: 有没有一种方法可以修改此查询,以便仅获取与条件匹配的唯一composition_batch记

    • 问题 你正在写一个多线程程序,其中线程需要一次获取多个锁,此时如何避免死锁问题。 解决方案 在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的。举个例子:一个线程获取了第一个锁,然后在获取第二个锁的 时候发生阻塞,那么这个线程就可能阻塞其他线程的执行,从而导致整个程序假死。 解决死锁问题的一种方案是为程序中的每一个锁分配一个唯一的id,然后只允许按照升序规则来使用多个锁,这个规则使用