Oracle - 如何知道批量插入已经结束?

时间:2015-04-14 05:02:00

标签: oracle bulkinsert

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

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

无论如何,我们可以知道批量插件是否已停止?如果我们想要监控表上是否有任何insert活动,是否可能?我们无法控制系统A如何工作,所以我们不能让它向我们发送任何“结束”信号。

任何评论都表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

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

如果系统A在V$SESSION中提供了足够的可见信息,系统视图显示所有已连接的会话,为了让您只确定系统A的会话,您应该能够查询{{ 3}}查找由这些会话锁定的对象:

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进程,以便在终止时引发某种形式的事件。你`V$LOCKED_OBJECT