【问题标题】:How to get a real time within PostgreSQL transaction?如何在 PostgreSQL 事务中获得实时?
【发布时间】:2011-03-22 18:13:45
【问题描述】:

据我了解 now() 在整个 PostgreSQL 事务期间返回同一时间? 但是如何获得实时时间?

另外,我有兴趣是否有任何配置参数来限制交易的持续时间,以便在此期限到期后交易将立即失败或以其他方式禁止后续查询?

【问题讨论】:

  • 这两个问题似乎与我无关。
  • 我想限制事务持续时间滥用,因此,根据标准解决方案的灵活性,我会选择它,或者我基于实时的自定义解决方案(存储过程中的失败事务)。因此,问题与我的任务范围有关。
  • 我找不到关于事务持续时间/回滚超时的文档。您可能会从会话超时中得到一些东西(并在专用会话中触发此事务),但这仍然不够优雅。我会看看你漂亮的自定义解决方案是否有效。 :)
  • documentation on Current Date/Time。特别是函数clock_timestamp 可能对这个问题有用。

标签: sql database postgresql transactions


【解决方案1】:

使用clock_timestamp()

now()是传统的PostgreSQL等价于transaction_timestamp(),也就是等价于CURRENT_TIMESTAMP。这些函数返回当前事务的开始时间。它们的值在交易期间不会改变。

statement_timestamp()返回客户端收到最新命令消息的时间。

clock_timestamp() 返回实际的当前时间,因此即使在单个 SQL 命令中其值也会发生变化。

有关详细信息,请参阅documentation

【讨论】:

  • 为我工作,带有TIMESTAMPTZ 列。
【解决方案2】:
Timeofday()

可能对你有用。

【讨论】:

  • 一个你必须记住的怪癖:“timeofday() 是一个历史 PostgreSQL 函数。像 clock_timestamp() 一样,它返回实际的当前时间,但作为格式化的文本字符串而不是时间戳记时区值。”
  • @Milen 感谢您的评论。它本身应该是一个答案,所以我可以投票赞成:)
  • @MilenA.Radev timeofday() 确实返回文本,但 clock_timestamp() 返回带有时区的时间戳。
【解决方案3】:

要限制语句(不是事务)的时间,您可以使用 statement_timeout。 now() 将在每次执行 if 时递增,而不是在事务块内。因此:

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=# 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多