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

Oracle - How to know a bulk insert has ended?

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

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

有没有办法知道批量插入是否已经停止?如果我们要监控在table上有没有insertactivity完成,可以吗?不幸的是,我们无法控制系统 A 的工作方式,因此我们无法让它向我们发送任何 'ending' 信号。

如有任何意见,我们将不胜感激。谢谢。

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

如果系统 A 在 V$SESSION, the system view that shows all connected sessions, in order for you to positively identify only System A's sessions, you should be able to query `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.