【问题标题】:Oracle - How to know a bulk insert has ended?Oracle - 如何知道批量插入已结束?
【发布时间】:2015-04-14 15:42:17
【问题描述】:

我们在 Oracle 数据库中有一个表,它充当两个系统之间的中介。系统 A 将对表进行批量插入,每 50,000 行提交一次。系统B会不断查询表的记录,如果有记录,会发出SELECT .. FOR UPDATE语句来处理记录(系统B是多线程的)。

问题是,当系统 B 查询表时,系统 A 仍有可能批量插入数据。这可能会导致系统 B 获取不完整的数据集进行处理。

我们是否可以知道批量插入是否已停止?如果我们想监控桌子上是否有任何insert活动,有可能吗?不幸的是,我们无法控制系统 A 的工作方式,因此我们无法让它向我们发送任何“结束”信号。

感谢任何 cmets。谢谢。

【问题讨论】:

  • 您可以查询活动的数据库会话以查看系统 A 是否仍然连接。
  • 如果系统A连接到数据库,但它正在做其他事情没关系,问题是我们是否可以知道它已经停止向表中放入数据
  • 系统B一次处理多少条记录???
  • U 可以有一个临时表,其中包含表的主键和已处理标志,以便您知道哪些行已处理,其余行可以在系统 B 中处理
  • 您可以检查 SQL 系统 A 当前正在运行什么查询。

标签: oracle bulkinsert


【解决方案1】:

执行 INSERT 时,Oracle 将automatically acquire row/table level locks

如果系统 A 在 V$SESSION(显示所有已连接会话的系统视图)中提供了足够的可见信息,为了让您仅积极识别系统 A 的会话,您应该能够查询 `V$LOCKED_OBJECT 以查找被锁定的对象那些会议:

select count(*)
  from v$locked_object v
  join all_objects d
    on v.object_id = d.object_id
  join v$session s
    on v.session_id = s.sid
 where d.owner = :owner
   and d.object_name = :table_name
   and s.<some_identifying_data> = :something

如果系统 A 正在锁定您的对象,那么您需要继续等待;如果系统 A 锁定对象并且不再锁定,那么您可以启动辅助进程。这将需要测试以确定系统 A 的确切行为。

我知道这并不完全可能,但更综合的方法是修改系统 A 进程,使其在终止时引发某种形式的事件。你can use this event to start a scheduled job

【讨论】:

  • 是的,对系统 A 进行修改是不可能的,但使用锁来执行此操作的想法可能会削减它。我来看看。谢谢=)
  • 我们做了一个小样本测试,它似乎工作,基本上按照你的想法寻找锁。虽然要使用大型数据集进行测试,但我仍然认为将其标记为答案就足够了。
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 2012-01-17
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多