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*
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. |