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

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

Спасибо.

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


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

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

Использование PQtransactionStatus дает нужный результат, но только в Си-шной программе.
...
Рейтинг: 0 / 0
21.07.2017, 16:09
    #39493041
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать состояние текущего соединения
LeXa NalBatВ Postgresql 10 появится функция txid_current_ifassigned(). а в ридонли транзах , например на стендбае, как оно ?
...
Рейтинг: 0 / 0
21.07.2017, 17:07
    #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
23.07.2017, 11:29
    #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
23.07.2017, 12:08
    #39493514
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать состояние текущего соединения
Вообще в порядке бреда для микросекундной точности достаточно:
Код: sql
1.
select xact_start < query_start as in_transaction from pg_stat_activity where pid=pg_backend_pid();



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

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

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

Если приложение однопоточно, то нет необходимости знать состояние соединения.
...
Рейтинг: 0 / 0
24.07.2017, 12:55
    #39493922
p2.
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
24.07.2017, 20:11
    #39494193
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать состояние текущего соединения
big-trotMelkijОбычно открыта ли транзакция приложение знает само.
В однопоточном приложении известно состояние транзакции.
В многопоточном при условии, что соединение с БД является разделяемым ресурсом этого приложения, то не знает.гм.

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

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

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

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


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