Concurrent read and write access of LargeObject via getBlob() can raise exception

From: Balázs Zsoldos <balazs(dot)zsoldos(at)everit(dot)biz>
To: List <pgsql-jdbc(at)postgresql(dot)org>
Subject: Concurrent read and write access of LargeObject via getBlob() can raise exception
Date: 2015-08-18 18:54:19
Message-ID: CAHEBw=Sn5YLE=yNa9HTuFJzcnKojtYK1AO4VxA9D2-nd044amg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hi,

I created a table with the following fields:

- blob_id: bigint / primary key, auto increment
- blob: oid / a pointer to a large object

I created a trigger that unlinks the largeobject if a record is deleted
from this table.

If I

- select a record from my table and get the ResultSet instance
- parallel, I delete the blob within another transaction
- call resultSet.getBlob(1).getBinaryStream();

I get the following exception:

Caused by: org.postgresql.util.PSQLException: ERROR: large object 97664
does not exist
at
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at
org.postgresql.core.v3.QueryExecutorImpl.receiveFastpathResult(QueryExecutorImpl.java:672)
at
org.postgresql.core.v3.QueryExecutorImpl.fastpathCall(QueryExecutorImpl.java:501)
at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:109)
at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:156)
at org.postgresql.fastpath.Fastpath.getInteger(Fastpath.java:168)
at
org.postgresql.largeobject.LargeObject.<init>(LargeObject.java:106)
at
org.postgresql.largeobject.LargeObject.<init>(LargeObject.java:123)
at org.postgresql.largeobject.LargeObject.copy(LargeObject.java:128)
at
org.postgresql.jdbc4.AbstractJdbc4Blob.getBinaryStream(AbstractJdbc4Blob.java:26)
at
org.everit.blobstore.jdbc.internal.StreamBlobChannel.read(StreamBlobChannel.java:97)
at
org.everit.blobstore.jdbc.internal.JdbcBlobReader.read(JdbcBlobReader.java:128)

For me that means that it is impossible to be sure that between getting a
record from my table and getting the actual content of the blob, the
content will be still the same as when I selected the blob record.

I guess I can use safely the table only if I select the record with FOR
SHARE.

Regards,
*Balázs **Zsoldos*

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Thomas Hill 2015-08-18 20:33:08 language of error text messages
Previous Message Robert Haas 2015-08-18 17:01:29 Re: Proposal: Implement failover on libpq connect level.