【问题标题】:Batch Running On Multiple Servers批处理在多台服务器上运行
【发布时间】:2011-06-14 11:48:51
【问题描述】:

我有一个包含这些步骤的批处理应用程序。

  • 从表中选择更新标志列为空的所有记录
  • 处理所选信息
  • 将记录标记为已更新

我正在使用 Oracle 10g,我想要做的是能够在多个服务器上同时执行这个应用程序。但是,我担心Oracle的锁定机制。 当我在第一台服务器上运行的应用程序的第一个实例选择一条记录时,第二台服务器上运行的另一个实例不应该能够选择它。

是否适合将“选择更新”用于这种目的?如果我使用“选择更新跳过锁定”模式,应用程序的第二个实例是否会静默跳过之前被第一个实例锁定的记录并选择其他行?还是等到锁定的行被释放?

任何意见和建议将不胜感激

【问题讨论】:

  • 一个数据库实例和多个客户端,对吗?如果是这样,只需使用表中的一个字段(或多个字段)来攻击数据的不同部分(session1:select * from table where flag='A',session2:select * from table where flag='B')。您可以使用日期或任何与客户端会话互斥的字段(动态分区)

标签: database oracle concurrency batch-file oracle10g


【解决方案1】:

我的同事 Rob 写了一篇关于这个的好文章 Parallellism in a skip locked scenario 所以是的,它有效,不,它不会帮助你。 FWIW:稍微改变算法,给更新标志一个值,一个增量数字来帮助处理新数据的选择过程,并在准备好时更新为 NULL 可能会更聪明。这里的优势是双重的

  1. 减小索引大小
  2. 它使并行性更容易实现,因为进程现在都可以选择“自己的”行。

希望对你有帮助。

【讨论】:

  • 所以你说的是 FOR UPDATE SKIP LOCKED 方法不会提高性能,正如 Rob 在他的文章末尾所说的那样。你不是吗?顺便说一句,我只是无法完全理解您的替代方法。你能把你的建议说得更清楚一点吗?
  • 在有许多短时间更新且在客户端上花费很少时间的情况下,管理锁定的开销可能比仅在串行模式下执行此类工作需要更多时间。当客户端有很多时间时,跳过锁定方案可能是一个很好的解决方案。您可以在更新标志中输入一个序列值,并让每个进程选择它自己的数字范围并锁定它们。例如,如果使用 2 个进程,则为奇数和偶数。或在使用 4 个 proc 时取模 4。准备好时将标志设置为 NULL 有帮助,它使其余标志更好地可选择。
【解决方案2】:

我使用select for update skip locked,它工作正常。是的,以后的会话会静默地跳过被早期会话锁定的记录并选择/锁定其他行。确保并行处理会话没有修改其他常见数据,否则您会陷入另一个瓶颈。

declare 
  my_limit constant number default 1000;
  cursor cRecords is
    select primary_key
    from processed_table t
    where t.update_flag is null
    for update skip locked;
  type t_cRecords is table of cRecords%rowtype;
  tRecords t_cRecords;
begin
  open cRecords;
  while true loop
    -- Select all the records from the table where the update-flag column is null
    fetch cRecords bulk collect into tRecords limit my_limit;
    -- Process the selected information
    -- ...
    -- Mark the record as updated
    forall i in tRecords.first..tRecords.last
      update processed_table
        set update_flag = 'PROCESSED'
      where primary_key = tRecords(i).primary_key;
    --
    exit when tRecords.count < my_limit;
  end loop;
end;

顺便说一句,我不确认Parallellism in a skip locked scenario - 在我的网站上,使用 rwijk 的脚本可以加快 4 到 1 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2012-03-22
    • 2013-01-15
    相关资源
    最近更新 更多