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中创建自主事务。
注意
需要注意的是是通过后台辅助进程(或者线程)的方式构建的自主事务在每次调用这个事务时,都需要后端创建一个辅助进程(或者线程), 这会导致性能消耗,因为每次构建辅助进程(或者线程),都存在上下文切换的开销
显然,这种情况下,频繁匿名事务的创建,子事务提前提交,并且独立于主线事务运行会是更好的解决方案。