While working on JDBC with Postgres ...
Isolationlevel = "Reading Read"
I have the same deadlock in a multi-threaded environment when I tried to update the table after some operations. So I tried using a few queries as shown below.
ps = con.prepareStatement("UPDATE TableA SET column1=column1-? WHERE column2=? and column3=?;" + "UPDATE TableA SET column1=column1+? WHERE column2=? and column3=?;");
Here are the postgresql logs for the error
2016-12-19 12:25:44 IST STATEMENT: UPDATE TableA SET column1=column1+$1 WHERE column2=$2 and column3=$3 2016-12-19 12:25:44 IST FATAL: connection to client lost 2016-12-19 12:25:45 IST ERROR: deadlock detected 2016-12-19 12:25:45 IST DETAIL: Process 8524 waits for ShareLock on transaction 84942; blocked by process 12520. Process 12520 waits for ShareLock on transaction 84940; blocked by process 20892. Process 20892 waits for ExclusiveLock on tuple (1,5) of relation 25911 of database 24736; blocked by process 8524. Process 8524: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3 Process 12520: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3 Process 20892: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3 2016-12-19 12:25:45 IST HINT: See server log for query details. 2016-12-19 12:25:45 IST CONTEXT: while locking tuple (1,12) in relation "TableA" 2016-12-19 12:25:45 IST STATEMENT: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3 2016-12-19 12:25:45 IST LOG: could not send data to client: No connection could be made because the target machine actively refused it.
In this multi-threaded environment, I expected TableA tables to be locked for 2 statements and avoid deadlocks.
I see a similar scenario is explained in Postgres Docs
I could not find any way to avoid such a dead end. Any help is appreciated. Thanks
PS: Autocommit is already set to FALSE and tried using prepared Statements with one UPDATE query.
Regarding multiple queries -> Several queries in one preliminary sentence, and this shows that postgres does not need any additional configurations.
source share