Sql 使用选择。。。用于更新以轮询值更改

Sql 使用选择。。。用于更新以轮询值更改,sql,oracle,Sql,Oracle,我有一个包含任务及其状态的表,类似于: | task_id | task_status | +---------+-------------+ | 71 | 1 | | 85 | 3 | | 110 | 2 | 让我们调用表TASKS 状态是一个枚举值,例如: =SCHEDULED =正在运行 =DONE 我需要轮询此状态以通知用户他启动的任务。目前,我只是使用while循环在服务器上轮询它,就像下面的伪代

我有一个包含任务及其状态的表,类似于:

| task_id | task_status |
+---------+-------------+
|      71 |           1 |
|      85 |           3 |
|     110 |           2 |
让我们调用表
TASKS

状态是一个枚举值,例如:

  • =
    SCHEDULED
  • =
    正在运行
  • =
    DONE
  • 我需要轮询此状态以通知用户他启动的任务。目前,我只是使用
    while
    循环在服务器上轮询它,就像下面的伪代码:

    status = old_status
    while(timeout_not_expired and status==old_status) {
        status = get_status("SELECT task_status FROM TASKS WHERE task_id=%1", task_id)
        wait(check_interval)
    }
    return status
    
    这太糟糕了,它不仅垃圾处理Oracle SQL server,还垃圾处理我们的SQL查询日志

    所以我在谷歌上搜索了一下,找到了关于
    SELECT。。。用于更新
    。我试图运行以下语句:

    SELECT 
    task_status
    FROM TASKS
    WHERE task_id = 361
    FOR UPDATE OF task_status
    
    但它马上就回来了。因此,问题是:

  • 这就是更新的
    的目的吗
  • 如果是,我如何让它在有超时的行上等待

  • 不,那不是该条款的目的

    FOR UPDATE
    子句允许您锁定所选行,以便在您结束事务之前,其他用户无法锁定或更新行

    您的查询选择该任务的当前状态并锁定该行,基本上假设您计划更新该行,并且不希望其他任何人能够在您的
    选择
    和后续的
    更新
    之间更改该行

    因此,在您执行该查询之后,在您提交或回滚之前,其他人无法更新该任务的状态,这与您试图实现的目标正好相反

    您可以查看警报或排队机制,但您可能希望进行调查,尽管这可能有点过头了