我一直在彻底阅读我的其他问题中建议的关于事务隔离的 postgres 文档,但我仍然没有设法理解“谓词锁定”的东西。
我希望有人能启发我:-)
根据文档:PostgreSQL 中的谓词锁与大多数其他数据库系统一样,基于事务实际访问的数据
听起来不错,那么为什么会发生以下情况?
CREATE TABLE mycustomer(cid integer PRIMARY KEY, licenses integer);
CREATE TABLE mydevice(id integer PRIMARY KEY, cid integer REFERENCES
mycustomer (cid), status varchar(10));
INSERT INTO mycustomer(cid, licenses) VALUES (1, 5);
INSERT INTO mycustomer(cid, licenses) VALUES (2, 5);
Request 1 Request2
BEGIN TRANSACTION ISOLATION
LEVEL SERIALIZABLE;
BEGIN TRANSACTION ISOLATION
LEVEL SERIALIZABLE;
SELECT * from mydevice where cid = 1;
SELECT * from mydevice where cid = 2;
INSERT INTO mydevice(id, cid, status)
VALUES (1, 1, 'ok');
INSERT INTO mydevice(id, cid, status)
VALUES (2, 2, 'ok');
commit;
(=ok)
commit;
(=rollback)
我了解请求 1 和请求 2 中的插入与之前的读取不冲突,因此不应启动任何错误。为什么我收到“错误:由于事务之间的读/写依赖关系而无法序列化访问”。
正如您可以想象的那样,我不能发生上述行为,因为每个并发请求都会被回滚,而不管其细节如何。在我的业务场景中,我希望并发请求仅在他们为同一个客户插入数据(根据示例设备)时回滚。
这些操作是从 Java 应用程序执行的,原则上我正在考虑创建一个锁定表来满足我的需要。有任何想法吗?
非常感谢!