Как PostgreSQL обрабатывает временную таблицу ON COMMIT DROP перед лицом нескольких потоков?

Согласно документации:

ON COMMIT DROP: временная таблица будет удалена в конце текущего блока транзакции.

Однако временные таблицы уникальны для каждого сеанса, а не для каждого потока: см. здесь

Мой вопрос:

Если временная таблица помечена WITH ON COMMIT DROP, как PG будет обрабатывать несколько потоков, обращающихся к этой таблице, в отношении того факта, что любой поток может зафиксировать, но таблицу нельзя удалить, поскольку она используется другими потоками.

Изменить: насколько я знаю, в рамках одного сеанса может выполняться несколько транзакций. Если это так, более чем одна транзакция может получить доступ к функции с временной таблицей, отсюда и мой вопрос.


person IamIC    schedule 18.10.2017    source источник
comment
Используют ли потоки одно и то же соединение/сеанс?   -  person wildplasser    schedule 18.10.2017
comment
Это немного не в моей области, но из того, что я прочитал, если кто-то использует пул соединений, тогда несколько потоков будут использовать одно и то же соединение и, предположительно, сеанс.   -  person IamIC    schedule 18.10.2017
comment
Не усложняйте ситуацию, добавляя пул соединений. (или: перефразируйте вопрос)   -  person wildplasser    schedule 18.10.2017
comment
Насколько мне известно, сеанс может выполнять несколько транзакций. Отложите объединение в сторону.   -  person IamIC    schedule 18.10.2017
comment
Также возможно, что я неправильно понял данные в ссылке, которую я прочитал, и поток просто относится к вызову функции из любой точки внутри транзакции. Если это так, то на мой вопрос дан ответ.   -  person IamIC    schedule 19.10.2017


Ответы (1)


Postgres (сервер) ничего не знает о клиентских потоках. Он рассматривает сеанс как последовательную серию команд, сгруппированных в транзакции. С точки зрения сервера параллелизм внутри сеанса невозможен.

Клиентское приложение может быть многопоточным, и потоки могут использовать одно и то же соединение. Разработчик приложения отвечает за то, чтобы потоки не конкурировали друг с другом за доступ к ресурсам сервера. Из документации:

Одно ограничение потока состоит в том, что никакие два потока не пытаются одновременно манипулировать одним и тем же объектом PGconn. В частности, вы не можете выполнять параллельные команды из разных потоков через один и тот же объект соединения. (Если вам нужно запускать параллельные команды, используйте несколько подключений.)

person klin    schedule 18.10.2017
comment
В этом есть смысл. Чего я не получаю, так это ответа Эрвина Брандштеттера по этой ссылке: временные таблицы"> stackoverflow.com/questions/10596896/. Зачем присваивать потоку уникальные идентификаторы? - person IamIC; 19.10.2017
comment
В моем понимании это описание частного случая многопоточности на стороне клиента. Эрвин пишет об одном из возможных способов совместного использования таблицы несколькими потоками. - person klin; 19.10.2017
comment
Итак, суть в том, что на сервере, без каких-либо странных клиентских потоков (нарушающих правила), не о чем беспокоиться, верно? - person IamIC; 19.10.2017
comment
Точно. Разработчики приложений должны использовать свои методы в многопоточной среде, чтобы сервер видел одну линейную сессию. - person klin; 19.10.2017