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

为什么80%的码农都做不了架构师?>>> hot3.png

原文链接

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, event_date timestamp, 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 以及语法补丁程序来实现。 ###匿名自治事务性能基准比较

PostgreSQL 匿名自治事务补丁(翻译)_第1张图片

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

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

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

PostgreSQL 匿名自治事务补丁(翻译)_第2张图片

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

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

注意

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

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

参考链接

补丁下载

pg_background

db_link

转载于:https://my.oschina.net/innovation/blog/746774

你可能感兴趣的:(数据库,后端)