为什么80%的码农都做不了架构师?>>>
原文链接
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 以及语法补丁程序来实现。 ###匿名自治事务性能基准比较
在这个测试中, 我们可以看到,pg_background 和杂注的 autonomous_transaction 性能接近。 这并不奇怪,因为该补丁并没有改变pg_background的运行机制, 同样创建一个独立的会话.
该补丁只是简单允许使用匿名自主事务,但是不允许异步模式。
显然,在异步模式下,pg_background 和db_link 显然优于autonomous_transaction语法补丁
注意,就我所知,其他 Dbms 也实现了实施自主事务,并且没有使用异步模式。
无论如何,不管此修补程序被接受与否,这都是件好事, 你可以使用三种不同的方法在PostgreSQL中创建自主事务。
注意
需要注意的是是通过后台辅助进程(或者线程)的方式构建的自主事务在每次调用这个事务时, 都需要后端创建一个辅助进程(或者线程), 这会导致性能消耗,因为每次构建辅助进程(或者线程),都存在上下文切换的开销
显然,这种情况下,频繁匿名事务的创建,子事务提前提交,并且独立于主线事务运行会是更好的解决方案。
参考链接
补丁下载
pg_background
db_link