2010-07-29 4 views
10

지금까지 내가 이해 한대로 now()은 PostgreSQL 전체 트랜잭션 동안 동일한 시간을 반환합니까? 그러나 얻는 방법 진짜 시간?PostgreSQL 트랜잭션 내에서 실시간을 얻는 방법은 무엇입니까?

또한이 기간 만료 트랜잭션이 즉시 실패하거나 다른 방법으로 다음 쿼리를 금지하도록 트랜잭션 기간을 제한하는 구성 매개 변수가 있으면 관심이 있습니까?

+2

두 가지 질문은 내게 관련이없는 것처럼 보입니다. –

+0

저는 트랜잭션 지속 기간 남용을 제한하고 싶습니다. 표준 솔루션의 유연성에 따라 선택할 수도 있고, 실시간을 기반으로하는 내 맞춤 솔루션 (저장 프로 시저에서 트랜잭션 실패) 일 수도 있습니다. 따라서 질문은 내 업무 범위와 관련이 있습니다. – seas

+0

롤백이있는 트랜잭션 지속 시간/시간 초과에 대한 문서를 찾을 수 없습니다. 세션 타임 아웃 시간이 초과 될 수 있으며 (전용 세션에서이 트랜잭션을 시작합니다), 여전히 우아하지 않습니다. 당신의 멋진 맞춤 솔루션이 작동하는지 알고 싶습니다. :) – Tobiasopdenbrouw

답변

3
Timeofday() 

사용할 수 있습니다.

+0

예, 작동합니다. 감사. – seas

+5

"timeofday()는 역사적인 PostgreSQL 함수입니다 clock_timestamp()와 마찬가지로 실제 현재 시간을 반환하지만 시간대 값이있는 타임 스탬프가 아니라 형식이 지정된 텍스트 문자열로 반환됩니다." –

+0

@Milen 귀하의 의견을 보내 주셔서 감사합니다. 그것은 내가 upvote 수 있도록 자체적으로 대답해야합니다 :) –

-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()transaction_timestamp()과 동등한 전통적인 PostgreSQL입니다 (CURRENT_TIMESTAMP과 동일). 이 함수는 현재 트랜잭션의 시작 시간을 반환합니다. 그들의 값은 거래 중에 변하지 않습니다.

statement_timestamp()은 클라이언트로부터 최신 명령 메시지를 수신 한 시간을 반환합니다.

clock_timestamp()은 실제 현재 시간을 반환하므로 단일 SQL 명령 내에서도 값이 변경됩니다.

자세한 내용은 documentation을 참조하십시오.

관련 문제