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
子句允许您锁定所选行,以便在您结束事务之前,其他用户无法锁定或更新行
您的查询选择该任务的当前状态并锁定该行,基本上假设您计划更新该行,并且不希望其他任何人能够在您的选择
和后续的更新
之间更改该行
因此,在您执行该查询之后,在您提交或回滚之前,其他人无法更新该任务的状态,这与您试图实现的目标正好相反
您可以查看警报或排队机制,但您可能希望进行调查,尽管这可能有点过头了