我要在这里编写一些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。
答案 0 :(得分:1)
我不知道像你建议的那样在Oracle中断原子进程的方法。我认为你能做的唯一事情就是将programmaticaly分解成较小的进程并轮询某种类型的sentinel表。因此,您可以编写一个更新1k的proc,检查作业表(或类似的东西)以查看是否有更高优先级的进程在运行,并且如果正在运行更高优先级的进程,通过等待循环暂停自己的执行。这是我能想到的唯一能让你的会话在这个过程中保持活力的东西。
如果您真的想要中止当前正在运行的优先级较低的线程并且丢失会话的进度是可以接受的,那么我会再次建议一个作业表来注册正在运行的SQL以及它运行的会话ID上。如果你运行一个更高优先级的语句,它应该再次检查jobs表,然后向低优先级会话(http://www.oracle-base.com/articles/misc/KillingOracleSessions.php)发出一个kill命令,同时插入一个记录到作业表中以记录它被杀死的事实。当优先级较高的进程完成时,它可以检查作业表以查看它是否负责杀死任何内容,如果是,则重新发出它。
答案 1 :(得分:-1)
这就是实施资源管理器的目的。