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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |