gpt4 book ai didi

sql - 如何锁定选择,而不仅仅是插入/更新/删除

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:09 24 4
gpt4 key购买 nike

假设我有如下代码:

begin
select ... from T where x = 42; -- (1)
.
.
.
update T ... where x = 42; -- (2)
commit;
end;

我说的正确吗,到 (2) 执行时,在 (1) 中从 T 中选择的任何内容可能不再在 T 中,例如,如果在另一个 session 中执行以下操作:

delete from T where x = 42;

如果是这样,我希望发生的是“锁定”T 的 select 语句,因此无法对其进行修改。

我意识到我可以通过以下方式明确地做到这一点:

lock table T in exclusive mode;

但是如果 T 是一个 View 呢?我是否必须查看 T 的 View / subview 的定义以找到它引用的所有表并单独锁定它们,或者我可以这样做:

begin
START_TRANSACTION;
select ... from T where x = 42; -- (1)
.
.
.
update T ... where x = 42; -- (2)
commit;
end;

START_TRANSACTION 确保锁定所有 select 语句中引用的所有表,直到事务完成?

或者对于这个问题还有其他更好的解决方案吗?如果这很重要,我正在使用 Oracle 10g。

最佳答案

Am I correct in saying that by the time (2) executes, whatever has been selected from T in (1) may no longer be in T

是的。

所以你可以通过做...来锁定行

SELECT ...
[INTO ...]
FROM T
WHERE x = 42
FOR UPDATE [NOWAIT];

如果其他人已经锁定了该行,您可以选择使用 NOWAIT 使语句失败。如果没有 NOWAIT,语句将暂停,直到它可以锁定该行。

关于sql - 如何锁定选择,而不仅仅是插入/更新/删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7817434/

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