【发布时间】:2017-12-05 13:11:33
【问题描述】:
我不太了解 SELECT FOR UPDATE 的锁定功能。
这是我尝试过的。
CREATE TABLE ACCOUNT_TAB (
ACC_ID int NOT NULL PRIMARY KEY,
BALANCE int NOT NULL
);
INSERT INTO ACCOUNT_TAB
VALUES(1, 100);
SELECT * FROM ACCOUNT_TAB FOR UPDATE;
SELECT * FROM ACCOUNT_TAB;
两个 SELECT 都会检索该行,但第一个查询不应该锁定 ACCOUNT_TAB 表中的行吗?
我读过一些关于会话的内容:来自同一会话的查询不关心锁。我可以以某种方式在单个脚本文件中演示锁定功能吗?例如,我是否可以在一个脚本中运行两个不同的会话,以便第二个调用将检索一个错误,指出该行已锁定?
【问题讨论】:
-
锁只阻止更新或删除,不阻止选择
-
好的,但是,有没有办法在单个脚本文件中演示锁定?如果我选择更新然后进行两次更新,它当然会允许两次更新,因为我请求选择更新。可能有 2 个事务同时运行?
-
在您创建
commit之前,其他会话不会看到更改者 -
我不清楚你到底想“展示”什么 - 但要测试/展示锁定和并发性,你至少需要 两个 数据库会话(事务) - 你single 脚本无法做到这一点。
-
@a_horse_with_no_name - 实际上我们可以演示它。看我的回答
标签: sql oracle transactions locking