Postgres 40001 Exception Conditional Insert
-1
votes
2
answers
1291
views
I have 3 tables,
A
,B
and C
. A function actOnABC(i)
which is a read only operation on the tables:
IF actOnABC(i) = 0 THEN
RAISE EXCEPTION 'Message';
ELSE
INSERT INTO TABLE B VALUES(...);
END IF;
I am running this with Spring JDBC, Transaction Isolation level set to SERIALIZABLE.
As the load/number of concurrent transactions increase, I get the Exception with message:
> ERROR: could not serialize access due to read/write dependencies
> among transactions.
Lets say, I have two concurrent Transactions T1
and T2
. T1 and T2
both are attempting to insert. If say, T1
is successful in making the insert first into table B
, then potentially the result of actOnABC(i)
which was already evaluated by T2
could change. Hence T2
will throw an exception.
Have I understood the situation correct? Also, is there any way I can combine the actOnABC(i)
call with the INSERT
statement so as to avoid this race condition? I did think of using transaction level locks. But I am afraid that won't work as I have other stored procedures actively updating the Tables A
, B
and C
.
Is there a smarter way to deal with the situation?
EDIT: Some more information on the stored procedure actOnABC()
. This procedure returns an integer which is calculated as below.
SELECT count(*) into tmp_a from (... access tables..);
SELECT count(*) into tmp_b from (... access tables...);
return tmp_a - tmp_b;
Asked by cplusplusrat
(99 rep)
Mar 18, 2017, 12:22 AM
Last activity: Oct 20, 2019, 01:02 PM
Last activity: Oct 20, 2019, 01:02 PM