PostgreSQL 事务,会话 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)
时间: 2024-09-09 13:34:55

PostgreSQL 事务,会话 GUC 变量 妙用的相关文章

PostgreSQL 11 preview - pgbench 变量、函数扩展 - 暨pgbench 自定义 benchmark讲解

标签 PostgreSQL , pgbench , 压测 , 变量 , tpc-b , 自定义压测 背景 pgbench是PostgreSQL软件包中的一款benchmark软件,纯C编码,效率高,压测方便. 内置TPC-B benchmark测试,同时支持自定义benchmark. 详细文档见 https://www.postgresql.org/docs/10/static/pgbench.html pgbench 自定义benchmark脚本支持的语法 变量赋值的语法 压测需要生成输入变量

SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)

前言 接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题. SQL Server事务对本地变量影响 事务对变量影响具体是指什么意思呢,换句话说就是当我们回滚事务和提交事务之后对本地变量是否起作用呢,下面我们来看下具体例子. PRINT '回滚事务之后测试' DECLARE @FlagINT INT SET @FlagInt = 1 PRINT @FlagInt ---- 此时变量值为1 BEGIN TRANSACTION S

让 sysbench 支持 PostgreSQL 服务端绑定变量

首先介绍一下几种数据库绑定变量的语义..1. PostgreSQL 绑定变量的语义是使用?来表示任意位置的变量, 例如 : select info from test where id=? and c1=?; .2. Oracle 使用:var来表示变量,例如: stmt = db_prepare("UPDATE ".. table_name .." SET k=k+1 WHERE id=to_number(:x) and 'a' = :y") params = {

数据库案例集锦 - 开发者的《如来神掌》

背景 「剑魔独孤求败,纵横江湖三十馀载,杀尽仇寇,败尽英雄,天下更无抗手,无可柰何,惟隐居深谷,以雕为友.呜呼,生平求一敌手而不可得,诚寂寥难堪也.」 剑冢中,埋的是剑魔独孤求败毕生几个阶段中用过的几柄剑: 利剑无意:第一柄是青光闪闪的利剑,凌厉刚猛,无坚不摧,弱冠前以之与河朔群雄争锋. 软剑无常:第二柄是紫薇软剑,三十岁前所用,误伤义士不祥,悔恨不已,乃弃之深谷. 重剑无锋:第三柄是玄铁重剑,重剑无锋,大巧不工,四十岁之前恃之横行天下. 木剑无俦:第四柄是已腐朽的木剑. 无剑无招:四十岁后,不

一天学会PostgreSQL应用开发与管理 - 6 事务和锁

本章大纲 一.什么是事务 二.单用户情况下的事务 三.多用户情况下的事务 1 PostgreSQL如何处理事务隔离? 2 多用户情况下的事务并发处理 四.锁 五.数据恢复粒度 六.数据年龄 七.事务冻结 八.垃圾回收 九.flash back query 第四章:事务和锁 https://www.postgresql.org/docs/9.6/static/mvcc.html 1. 什么是事务 ACID介绍 1. 原子性:同一个事务中的所有操作,要么全部成功,要么全部失败.即使数据库恢复,也不能

InnoDB事务结构体代码变量列表

事务结构 struct trx_t 写在前面 InnoDB是MySQL的一个存储引擎,支持事务,支持非堵塞的一致性读,物理存储结构是Page,每个事务都有回滚日志,重做日志,事务还会有死锁检测,各种各样不同的锁等等等等 翻看innodb的源码,发现数下来开启一个事务的时候,InnoDB需要处理63个变量,变量类型纷繁复杂,结构体,自定义的数据类型等等. 这次整理,我翻看了不少同行们写的博客,包括InnoDB官方博客,有一个心得是不同人的翻译不一样,尽管是官方写的博客,也会因为一些篇幅问题,减掉了

如何让普通变量也支持事务回滚?

有一次和人谈起关于事务的话题,谈到怎样的资源才能事务型资源.除了我们经常使用的数据库.消息队列.事务型文件系统(TxF)以及事务性注册表(TxR)等,还有那些资源直接可以纳入事务进行状态的管理呢?我说如果我们按照.NET事务模型的规范对相应的资源进行合理的封装,原则上我们可以让任何可编程的资源成为事务型资源.本篇文章中,我将通过简单的编程将一个普通的变量变成支持事务,让变量的值也可以回滚,以确保事务前后的数据一致性. 一.什么是事务型的变量 本文中所说的事务型变量指的是这样的变量: 在事务开始前

PostgreSQL 10.0 解读

背景 本文参考当前的release notes以及git, committe fest编写,10.0还没有正式release,部分内容在正式release时可能会修改,同时会新增新的内容. 迁移到10.0的注意事项 迁移时,请注意不兼容的地方. 1. 使用pg_upgrade升级时,hash index 需要重建.(因为10.0为了支持hash index WAL,存储结构改变了.) 2. $PGDATA/pg_log, pg_xlog, pg_clog目录分别重命名为log, pg_wal,

PostgreSQL 9.6 快照过旧 - 源码浅析

PostgreSQL 9.6 快照过旧 - 源码浅析 作者 digoal 日期 2016-10-05 标签 PostgreSQL , 9.6 , 快照过旧 , snapshot too old 背景 在PostgreSQL 9.6以前,垃圾回收存在的问题. 当vacuum回收垃圾时,遇到垃圾记录的xmax大于数据库中现存的最早未提交事务xmin时,不会对其进行回收. 因此当数据库中存在很久为结束的事务时,可能会导致数据库膨胀. PostgreSQL 9.6加入了快照过旧的功能,目的是防止过长的事