CREATE TABLE test (id INT PRIMARY KEY);
和几行:
INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (2);
使用我最喜欢的JDBC查询工具(ExecuteQuery),我将两个会话窗口连接到存放这个表的数据库中。它们都是事务性的(即,auto-commit=false)。我们称它们为S1和S2。
对于每个会话窗口,使用相同的代码段:
1:DELETE FROM test WHERE id=1;
2:INSERT INTO test VALUES (1);
3:COMMIT;
现在,以慢动作运行这个程序,在窗口中逐个执行。
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 0 rows deleted. HUH???
S2-2 runs, reports a unique key constraint violation
现在,在SQLServer中这个工作得很好。当S2执行删除操作时,它报告删除了1行。然后S2的插入操作也正常工作。
我怀疑PostgreSQL是锁定了包含该行的表中的索引,而SQLServer则锁定实际的键值。
我是对的吗?这个问题能解决吗?