2010-07-29 4 views
10

Насколько я понимаю сейчас() возвращает то же время во время всей транзакции PostgreSQL? Но как получить real раз?Как получить реальное время в транзакции PostgreSQL?

Кроме того, меня интересует, существует ли какой-либо параметр конфигурации для ограничения продолжительности транзакции, чтобы после этого периода операция истечения срока действия немедленно прекратилась или каким-то другим образом запретила выполнение следующих запросов?

+2

Эти два вопроса кажутся мне не связанными. –

+0

Я хотел бы ограничить злоупотребление продолжительностью транзакций, поэтому, в зависимости от стандартной гибкости решения, я бы выбрал его или свое собственное решение на основе реального времени (транзакция с ошибкой в ​​хранимой процедуре). Таким образом, вопросы связаны с моей задачей. – seas

+0

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

ответ

3
Timeofday() 

Может работать для вас.

+0

Да, это работает. Благодарю. – seas

+5

Привычка, которую вы должны иметь в виду: «timeofday() является исторической функцией PostgreSQL. Подобно clock_timestamp(), она возвращает текущее текущее время, но как форматированную текстовую строку, а не временную метку со значением часового пояса». –

+0

@Milen Спасибо за ваш комментарий. Это должен быть ответ сам по себе, чтобы я мог его продвигать :) –

-2

Чтобы ограничить время утверждения (а не транзакции), вы можете использовать statement_timeout. now() будет увеличивать при каждом выполнении , если не входит в блок транзакций. Таким образом:

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:36.207614-07 
(1 row) 

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:36.688054-07 
(1 row) 

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:40.407623-07 
(1 row) 

postgres=# begin; 
BEGIN 
postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:43.417611-07 
(1 row) 

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:43.417611-07 
(1 row) 

postgres=# 
27

Использовать clock_timestamp().

now() является традиционным эквивалентом PostgreSQL, равным transaction_timestamp(), что эквивалентно CURRENT_TIMESTAMP. Эти функции возвращают время начала текущей транзакции. Их значения не изменяются во время транзакции.

statement_timestamp() возвращает время получения последнего сообщения команды от клиента.

clock_timestamp() возвращает фактическое текущее время, поэтому его значение изменяется даже в пределах одной команды SQL.

Для получения дополнительной информации см. documentation.

Смежные вопросы