Oracle中的自愿事务优先级



我将在这里编写一些sql。我想要的是如下内容:

select ... for update priority 2; // Session 2

所以当我在另一个会话中运行

select ... for update priority 1; // Session 1

它立即返回,并在会话2中抛出错误(因此进行回滚),并锁定会话1中的行。

然后,当会话1持有锁时,在会话2中运行以下命令:

select ... for update priority 2; // Session 2

将等待会话1释放锁。

我怎么能实现这样的方案,因为priority x只是我自己编出来的。我只需要可以处理两个优先级的东西。

另外,我很高兴把我所有的逻辑隐藏在PL/SQL过程中,我不需要这个为通用SQL语句工作。

我使用Oracle 10g,如果这有任何区别。

我不知道像你建议的那样在Oracle中中断原子进程的方法。我认为您唯一能做的就是通过编程将较大的进程分解为较小的进程,并轮询某种类型的哨兵表。因此,与其对100万行执行一次更新,不如编写一个进程来更新1k行,检查作业表(或类似的东西),看看是否有更高优先级的进程在运行,如果有更高优先级的进程正在运行,则通过等待循环暂停其自身的执行。这是我能想到的唯一能在此过程中保持会话存活的方法。

如果你真的想中止当前正在运行的低优先级线程的进程,并且失去会话是可以接受的,那么我建议再次使用一个jobs表,该表注册了正在运行的SQL和正在运行的会话ID。如果运行一个优先级更高的语句,它应该再次检查job表,然后向低优先级会话(http://www.oracle-base.com/articles/misc/KillingOracleSessions.php)发出kill命令,同时在jobs表中插入一条记录,以表明它已被杀死。当一个高优先级的进程结束时,它可以检查作业表,看看它是否有责任杀死任何东西,如果是,重新发布它。

这就是资源管理器实现的目的。

最新更新