gpt4 book ai didi

sql - Oracle 中的自愿事务优先级

转载 作者:搜寻专家 更新时间:2023-10-30 21:36:22 30 4
gpt4 key购买 nike

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

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

所以当我在另一个 session 中运行时

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

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

然后,在 session 1 持有锁的同时,在 session 2 中运行以下命令。

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

将等到 session 1 释放锁。

我怎么能实现这样的方案,因为 priority x 只是我编造的东西。我只需要可以执行两个优先级的东西。

此外,我很乐意将所有逻辑隐藏在 PL/SQL 过程中,我不需要它来处理通用 SQL 语句。

如果有任何不同,我正在使用 Oracle 10g。

最佳答案

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

如果你真的想中止当前运行的进程,较低优先级的线程和丢失 session 是可以接受的,那么我会再次建议一个作业表,它注册了正在运行的 SQL 和它正在运行的 session ID在。如果您运行更高优先级的语句,它应该再次检查作业表,然后向低优先级 session (http://www.oracle-base.com/articles/misc/KillingOracleSessions.php) 发出 kill 命令并插入一个记录到工作表中以注意它被杀死的事实。当一个更高优先级的进程完成时,它可以检查作业表以查看它是否负责杀死任何东西,如果是,则重新发出它。

关于sql - Oracle 中的自愿事务优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870316/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com