这很简单,但我对 PG 所做的(v9.0)感到困惑。我们从一个简单的表开始:
CREATE TABLE test (id INT PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)
和几行:
INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (2);
Run Code Online (Sandbox Code Playgroud)
使用我最喜欢的 JDBC 查询工具 (ExecuteQuery),我将两个会话窗口连接到该表所在的数据库。它们都是事务性的(即 auto-commit=false)。我们称它们为 S1 和 S2。
每个相同的代码位:
1:DELETE FROM test WHERE id=1;
2:INSERT INTO test VALUES (1);
3:COMMIT;
Run Code Online (Sandbox Code Playgroud)
现在,以慢动作运行它,在窗口中一次执行一个。
S1-1 runs (1 row deleted)
S2-1 runs (but is blocked since S1 has a write lock)
S1-2 runs (1 row inserted)
S1-3 runs, releasing the write lock
S2-1 runs, now that it can get the lock. But reports …
Run Code Online (Sandbox Code Playgroud)