У меня есть ситуация, когда INSERT может потерпеть неудачу с незначительными последствиями, но время от времени он также блокируется на некоторое время (ожидание блокировки), что может быть проблемой для вызывающего.
Один из вариантов - добавить оператор или тайм-аут блокировки, но это означает, что клиент ожидает до этого значения, и вставка теряется при достижении тайм-аута.
Возможной альтернативой было выполнить запрос асинхронно (через PQsendQuery
), но затем проигнорировать результат и закрыть соединение , как только запрос будет подтвержден. Гарантирует ли это, что запрос в конечном итоге будет выполнен (успешно или неудачно), или закрытие соединения означает, что postgres может отменить запрос до его завершения?
Примечание: технически я делаю это через асинхронные соединения psycopg2, поэтому ожидал cursor.execute()
, а затем ожидание, пока connection.poll()
вернет состояние, отличное от POLL_WRITE
. Предполагая, что вышесказанное работает, это добавляет проблем?