暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 事务,会话 GUC 变量 妙用 - 获取并跟踪事务结束时间(不是来自XLOG commit record哦)

digoal 2016-01-06
188
TAG 6

作者

digoal

日期

2016-01-06

标签

PostgreSQL , guc , 事务结束时间 , 触发器 , guc变量 , 统一每条记录的事务结束时间


背景

PostgreSQL有一种触发器叫行级约束触发器,这种触发器是在事务结束时被触发的。

用法可见

https://github.com/digoal/pgsql_admin_script/blob/master/pgq.md

如果我要获取事务结束的时间戳(大概的),并且如果多行触发了触发器函数时,要得到一个同样的时间戳,怎么搞呢?

用now()得到的是事务开始的时间。

用clock_timestamp(), statement_timestamp() 得到的是语句级的时间。

PG现成的函数都无法满足需求。

那么怎么来实现呢?

我们可以使用GUC变量来实现,自定义一个函数即可。

create or replace function get_commit_time() returns timestamp without time zone as $$ declare res timestamp without time zone; begin show commit_time.realval into res; return res; exception when others then -- 如果未设置, 则使用以下SQL设置. res := clock_timestamp(); execute 'set local commit_time.realval = '''||res||''''; -- 设置事务级变量 return res; end; $$ language plpgsql;

测试:

```
src=# begin;
BEGIN
src=# select now();
now


2016-01-06 18:03:40.101664+08
(1 row)

src=# select now();
now


2016-01-06 18:03:40.101664+08
(1 row)

src=# select clock_timestamp();
clock_timestamp


2016-01-06 18:03:49.115772+08
(1 row)
```

第一次调用当时的clock_timestamp取得的时间,事务中一直延续使用。

```
src=# select mq.get_commit_time();
get_commit_time


2016-01-06 18:04:02.244642
(1 row)

src=# select mq.get_commit_time();
get_commit_time


2016-01-06 18:04:02.244642
(1 row)

src=# select mq.get_commit_time();
get_commit_time


2016-01-06 18:04:02.244642
(1 row)

src=# show commit_time.realval;
commit_time.realval


2016-01-06 18:04:02.244642
(1 row)

src=# end;
COMMIT
```

事务结束后,释放。

```
src=# show commit_time.realval;
commit_time.realval


(1 row)
```

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论