PostgreSQL 匿名自治事务补丁(翻译)

前端之家收集整理的这篇文章主要介绍了PostgreSQL 匿名自治事务补丁(翻译)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文链接

author Gilles Darold 2016-09-08 译者: 小次郎@飞象

8月19日我在以前的帖子中提到的 Postgresql 匿名自主事务的两个等价实现(使用不同的方法)

8月31日,Peter Eisentraut 提交了补丁,实现了类似Oracle 的语法注解(AUTONOMOUS_TRANSACTION)

让我们看看它是如何使用的

这是一个打了语法补丁的Postgresql函数,其中使用了自主匿名事务: 它将记录独立于数据库主线事务运行,并且不关心主线事务的最终结果。

CREATE OR REPLACE FUNCTION log_action_atx (
	username text,event_date timestamp,msg text
) RETURNS VOID AS
$body$
DECLARE
	PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
	START TRANSACTION;
	INSERT INTO table_tracking VALUES (nextval('log_seq'),username,event_date,msg);
	COMMIT;
END;
$body$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION log_action (
	username text,msg text
) RETURNS VOID AS
$body$
DECLARE
        v_query     text;
BEGIN
	-- Call the autonomous transaction
        v_query := 'SELECT log_action_atx ( ' || quote_nullable(username) ||
		 ',' || quote_nullable(event_date) || ',' || quote_nullable(msg) || ' )';
        EXECUTE v_query;
	-- Do something else
END;
$body$
LANGUAGE PLPGsql;

匿名自治事务的性能基准比较,使用 dblink、 pg_background 以及语法补丁程序来实现。 ###匿名自治事务性能基准比较

在这个测试中,我们可以看到,pg_background 和杂注的 autonomous_transaction 性能接近。 这并不奇怪,因为该补丁并没有改变pg_background的运行机制,同样创建一个独立的会话.

该补丁只是简单允许使用匿名自主事务,但是不允许异步模式。

显然,在异步模式下,pg_background 和db_link 显然优于autonomous_transaction语法补丁

注意,就我所知,其他 Dbms 也实现了实施自主事务,并且没有使用异步模式。

无论如何,不管此修补程序被接受与否,这都是件好事,你可以使用三种不同的方法在Postgresql中创建自主事务。

注意

需要注意的是是通过后台辅助进程(或者线程)的方式构建的自主事务在每次调用这个事务时,都需要后端创建一个辅助进程(或者线程), 这会导致性能消耗,因为每次构建辅助进程(或者线程),都存在上下文切换的开销

显然,这种情况下,频繁匿名事务的创建,子事务提前提交,并且独立于主线事务运行会是更好的解决方案。

参考链接

补丁下载

pg_background

db_link

猜你在找的Postgre SQL相关文章