我们在Oracle数据库中有一个表,充当两个系统之间的中介。系统A将对表进行批量插入,每50,000行提交一次。系统B将继续查询表中的记录,如果有,将发出SELECT .. FOR UPDATE
语句来处理记录(系统B是多线程的)。
问题是,当系统B查询表时,系统A仍可能会批量插入数据。这可能会导致系统B获取不完整的数据集进行处理。
无论如何,我们是否可以知道批量插入是否已停止?如果我们要监视表上是否有任何insert
活动,可以吗?不幸的是,我们无法控制系统A的工作方式,因此我们无法通过它向我们发送任何“结束”信号。
任何意见表示赞赏。谢谢。
最佳答案
执行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的确切行为。
我知道这不是完全可能的,但是更集成的方法是修改System A流程,使其在终止时引发某种形式的事件。你can use this event to start a scheduled job。