PostgreSQL 事务,会话 GUC 变量 妙用

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

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)
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 缓存 运维
PostgreSQL 事务号回卷分析
## XID 定义 xid 是个啥东西?xid 就是 PostgreSQL 里面的事务号,每个事物都会分配一个 xid。PostgreSQL 数据中每个元组头部都会保存着 插入 或者 删除 这条元组的事务号,即 xid,然后内核通过这个 xid 进行元组的可见性判断。简单理解,比如有两个事务,xid1=200,xid2=201,那么 xid1 中只能看到 t_xmin 200 的元组。 ```c
|
存储 SQL Oracle
02-PostgreSQL 存储过程的进阶介绍(含游标、错误处理、自定义函数、事务)
02-PostgreSQL 存储过程的进阶介绍(含游标、错误处理、自定义函数、事务)
|
Oracle 关系型数据库 数据库
PostgreSQL技术大讲堂 - 第20讲:事务概述与隔离级别
PostgreSQL从小白到专家,技术大讲堂 - 第20讲:事务概述与隔离级别
392 2
|
关系型数据库 PostgreSQL
PostgreSQL事务提交日志与CLOG操作初步认识
PostgreSQL事务提交日志与CLOG操作初步认识
465 0
|
SQL 存储 Oracle
PostgreSQL 事务隔离级别的实现和多版本并发控制|学习笔记
快速学习 PostgreSQL 事务隔离级别的实现和多版本并发控制
PostgreSQL 事务隔离级别的实现和多版本并发控制|学习笔记
|
SQL Oracle 关系型数据库
Oracle/Mysql迁移到Postgresql事务回滚行为差异(开发避坑系列)
Mysql或Oracle迁移到Postgresql系产品后,经常会发生事务回滚导致的问题,具体问题一般都是类似于: **为什么我没rollback,我的事务就自己回滚了?** 下面我举一个简单的例子,说明下PG和其他两款DB在事务回滚行为上的差异 ## Oracle事务内报错后的行为 (完整代码贴在文章最后) ```java Class.fo
1254 0
|
SQL 弹性计算 Oracle
PostgreSQL native partition 分区表性能优化之 - 动态SQL+服务端绑定变量
标签 PostgreSQL , 分区表 , native partition , 性能 , pg_pathman , plpgsql , 动态SQL , 服务端绑定变量 , prepare , execute 背景 目前PG的native partition分区性能不佳,一种解决方法是使用pg_pathman插件,另一种方法是业务上直接插分区,还有一种方法是使用UDF函数接口(函数内部使
1536 0
|
SQL 关系型数据库 数据库
PostgreSQL TRANSACTION(事务)
TRANSACTION(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 当事务被提交给了数据库管理系统(DBMS),则 DBMS 需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的
261 0
|
存储 SQL 关系型数据库
【学习资料】第16期快速入门PostgreSQL应用开发与管理 - 6 事务和锁
大家好,这里是快速入门PostgreSQL应用开发与管理 - 6 事务和锁

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多
    下一篇
    oss云网关配置