我已经仔细阅读了关于事务隔离的 postgres 文档 http://www.postgresql.org/docs/current/static/transaction-iso.html建议在我的其他问题 https://stackoverflow.com/questions/12824217/isolation-level-serializable-in-spring-jdbc但我还没有设法理解“谓词锁定”的东西。
我希望有人能启发我:-)
根据文档:与大多数其他数据库系统一样,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 应用程序执行的,原则上我正在考虑创建一个锁定表来满足我的需求。有任何想法吗?
非常感谢!