让我们假设在 SQL 窗口 1 中我这样做:
-- query 1
BEGIN TRANSACTION;
UPDATE post SET title = 'edited' WHERE id = 1;
-- note that there is no explicit commit
然后从另一个窗口(窗口 2)我做:
-- query 2
SELECT * FROM post WHERE id = 1;
我得到:
1 | original title
这很好,因为默认隔离级别是 READ COMMITTED 并且因为查询 1 从未提交,所以在我从窗口 1 显式提交之前,它执行的更改是不可读的。
事实上,如果我在窗口 1 中执行以下操作:
COMMIT TRANSACTION;
如果我重新运行查询 2,我可以看到更改。
1 | edited
我的问题是:
为什么查询 2 在我第一次运行时返回正常?我期望它会阻塞,因为窗口 1 中的事务尚未提交,并且放置在行上的锁id = 1
是(应该是)一个未释放的独占锁,它应该像在窗口 2 中执行的那样阻塞读取。其余的都是有道理的对我来说,但我希望在SELECT
执行窗口 1 中的显式提交之前会卡住。