powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать состояние текущего соединения
16 сообщений из 16, страница 1 из 1
Как узнать состояние текущего соединения
    #39490269
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо узнать состояние текущего соединения, т.е. в текущем соединении открыта транзакция или нет?
Для других соединений вроде как понятно через pg_stat_activity. А вот для текущего соединения не понятно.

Спасибо.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39490314
ЖEHbKA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotНеобходимо узнать состояние текущего соединения, т.е. в текущем соединении открыта транзакция или нет?
Для других соединений вроде как понятно через pg_stat_activity. А вот для текущего соединения не понятно.

Спасибо.

посмотреть pg_stat_activity для своего соединения ( pg_backend_pid() )


хотя мож проще можно
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39490317
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЖEHbKA,

оно всегда активно
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39490323
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю надо использовать PQtransactionStatus
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39492999
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Postgresql 10 появится функция txid_current_ifassigned().
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493025
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

Использование PQtransactionStatus дает нужный результат, но только в Си-шной программе.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493041
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatВ Postgresql 10 появится функция txid_current_ifassigned(). а в ридонли транзах , например на стендбае, как оно ?
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493078
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqа в ридонли транзах , например на стендбае, как оно ?не пробовал 10-ку. на 9.5 txid_current() не выполняется

Код: plaintext
1.
2.
3.
$ psql postgres postgres
psql (9.5.4)
postgres=# select txid_current();
ERROR:  cannot execute txid_current() during recovery
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493505
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatВ Postgresql 10 появится функция txid_current_ifassigned().ридонли (даже не объявленная явно) транза не приобретает txid_current, если не вызвать txid_current(). если я верно помню.

т.е. txid_current_ifassigned() обнаружит не отсутствие транзакции, а отсутствие её инициализации "как пишущей". (например в момент вызова txid_current(), или insert /delete и т.п., если до этого номер тр-ии оставался "виртуальным")

Код: sql
1.
2.
3.
4.
begin READ ONLY;
 SELECT pg_backend_pid();
 SELECT txid_current();
commit;


--проследите за
SELECT * FROM pg_stat_activity ;
-- моментом появления backend_xid
и
select * from pg_locks --locktype ='transactionid'


т.е. номера транз идут не в порядке их старта, а в порядке инициации "как пишущих" [присвоения "реального тхид вместо виртуального] . я где--то специально ставил вызов PERFORM txid_current(); чтобы упорядочить txid конкурентов по строке вызова.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493514
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще в порядке бреда для микросекундной точности достаточно:
Код: sql
1.
select xact_start < query_start as in_transaction from pg_stat_activity where pid=pg_backend_pid();



Не очень ясен смысл. Обычно открыта ли транзакция приложение знает само.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493840
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MelkijОбычно открыта ли транзакция приложение знает само.
В однопоточном приложении известно состояние транзакции.
В многопоточном при условии, что соединение с БД является разделяемым ресурсом этого приложения, то не знает.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493847
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

тоже знает. Иначе что, собираетесь допускать, что потоки пишут в чужие транзакции?
Соединение или пул соединений ресурс разделяемый, но на транзакцию предоставляется потоку эксклюзивно. Иначе вы в принципе не можете использовать в этом приложении транзакции и поставленный в теме вопрос решён по определению - у вас statement based pool, в котором транзакций из нескольких запросов быть не может.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493866
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkijтоже знает. Иначе что, собираетесь допускать, что потоки пишут в чужие транзакции?
Соединение или пул соединений ресурс разделяемый, но на транзакцию предоставляется потоку эксклюзивно. Иначе вы в принципе не можете использовать в этом приложении транзакции и поставленный в теме вопрос решён по определению - у вас statement based pool, в котором транзакций из нескольких запросов быть не может.

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

Если приложение однопоточно, то нет необходимости знать состояние соединения.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39493922
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точностью до точности системного таймера:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
db=> select statement_timestamp(), current_timestamp;
     statement_timestamp      |             now
------------------------------+------------------------------
 2017-07-24 12:50:23.87756+03 | 2017-07-24 12:50:23.87756+03
(1 row)

db=> begin transaction;
BEGIN
db=> select statement_timestamp(), current_timestamp;
      statement_timestamp      |              now
-------------------------------+-------------------------------
 2017-07-24 12:50:33.787957+03 | 2017-07-24 12:50:31.419958+03
(1 row)
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39494193
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotMelkijОбычно открыта ли транзакция приложение знает само.
В однопоточном приложении известно состояние транзакции.
В многопоточном при условии, что соединение с БД является разделяемым ресурсом этого приложения, то не знает.гм.

разделяемый ресурс -- пул.

поток забирает из него соединение (из коллекции/вектора и тп). что--то в нем , в соединении, тут же делает. и тут же отдает, после использования, (т.е. возвращает в коллекцию, вектор и т.п.). при недостатке -- может дооткрыть, или встать в очередь при максимуме.

по крайней мере я так пул делал в малознакомой мне жабке. просто следил за руками. хотя у меня короткие транзы были -- на один вызов хранимки.
...
Рейтинг: 0 / 0
Как узнать состояние текущего соединения
    #39494199
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

да , это немного лучше, чем асинхронную pg_stat_activity опрашивать.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как узнать состояние текущего соединения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]