On 2/17/26 15:55, Greg Sabino Mullane wrote:
On Mon, Feb 16, 2026 at 12:45 PM Nico Heller <[email protected]>
wrote:
Does anyone have any idea what the root cause of my issue is? I
appreciate any insight.
As I said, hash collisions can be rules out, sadly.
Well, you could set log_statement to 'all' for a bit to see *exactly*
what each of the deadlocking processes are doing. Alternatively,
perhaps you can write a hashextendedkey() function that outputs
arguments and results to a log and/or a table.
I will give that a shot, thank you
keysToLock is a text[] parameter which is pre-sorted in our
application
Would not hurt to triple-check this part as well. Could show us the
app code? Maybe put in some sort of global assert in the app to verify
that things are indeed sorted as you think they are.
I am 100% sure this is the case, as the code base isn't huge and we have
central component which is *always* used to acquire advisory locks.
It looks as follows, in pseudo Kotlin code:
class LockingRepository(val sqlClient: SqlClient) {
@Transactional(propagation = MANDATORY) // enforces a transaction
is already active, using pg_advisory_xact_lock is senseless otherwise
fun acquireLocks(keys: List<String>) =
sqlClient.query(<QUERY_HERE>).param(:keys, sort(keys)).execute()
private fun sort(keys: List<String>) = keys.sort() // as I said,
it's sorted in some arbitrary way
}
Cheers,
Greg
--
Crunchy Data - https://www.crunchydata.com
Enterprise Postgres Software Products & Tech Support