gpt4 book ai didi

sql - 锁定 Oracle 行,使第二个线程无法读取数据

转载 作者:行者123 更新时间:2023-12-03 12:49:05 25 4
gpt4 key购买 nike

如何阻止一个线程的事务读取一行,直到另一个事务完成处理它?<​​/p>

我在 Oracle 11 数据库上有一个触发器表。触发器表上的一行有一个状态标志,用于指示是否需要发生某个过程 - 假设它是为了触发一封电子邮件。有一个批处理进程定期轮询触发器表。过程是:

  1. 获取 X 个状态为 NOT_SENT 的触发器
  2. 将 X 触发器的状态更新为 SENDING
  3. 发送 X 封电子邮件
  4. 将 X 触发器的状态更新为 SENT

但是我在集群环境中运行我的应用程序。因此,可能会有多个版本的批处理进程并行下拉触发器。我想确保相互竞争的批处理过程不会拉下相同的触发器并执行相同的处理,即发送相同的电子邮件。

我正在查看 Oracle SELECT FOR UPDATE 子句。但是,我不是 100% 清楚这是否符合我的要求。我需要线程 A 锁定触发器行和线程 B 以阻止读取或写入触发器行。 SELECT FOR UPDATE 是阻止线程 B 读取和写入还是阻止线程 B 仅写入,并不是 100% 清楚。我需要前者。

欢迎提出想法。

最佳答案

SELECT FOR UPDATE 锁定并读取该行。如果线程 A 已锁定该行,而线程 B 试图锁定它,则线程 B 将阻塞,直到线程 A 释放其锁定。因此,如果 A 和 B 都在执行 SELECT FOR UPDATE,线程 B 将等待 A 完成。

在 Oracle 中,读取器永远不会被写入器阻塞,因此其他线程可以自由读取 A 正在处理的行。他们只是无法锁定行。

当然,如果您的锁定机制将您的应用程序变成功能上单线程的应用程序,那么它就违背了拥有多个线程的目的。您可能需要考虑执行 SELECT FOR UPDATE SKIP LOCKED。这是一个很好的插图 how SKIP LOCKED works .

关于sql - 锁定 Oracle 行,使第二个线程无法读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com