为了利用异步通知,我将 postgresql jdbc 驱动程序从 pgjdbc 交换到 pgjdbc-ng,并且我在事务隔离级别可序列化时遇到了不同的行为。
执行查询:insert into "_revision"(revision, timestamp) select coalesce(max(revision), 0)+1, transaction_timestamp() at time zone 'utc' from "_revision" returning revision
使用 pgjdbc 驱动程序可序列化的事务隔离级别同时执行两次会导致错误:
ERROR: could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on identification as a pivot, during write.
HINT: The transaction might succeed if retried.
而与 pgjdbc-ng 驱动程序相同会导致错误:
ERROR: duplicate key value violates unique constraint "_revision_pkey"
DETAIL: Key (revision)=(2) already exists.
除了使用正确的数据源设置 hikari 连接池之外,我没有更改执行代码。有没有人经历过类似的事情或知道为什么 pgjdbc-ng 场景不会导致序列化失败?