【发布时间】:2012-09-28 11:54:34
【问题描述】:
以下 PostgreSQL 函数是自动事务性的吗?
CREATE OR REPLACE FUNCTION refresh_materialized_view(name)
RETURNS integer AS
$BODY$
DECLARE
_table_name ALIAS FOR $1;
_entry materialized_views%ROWTYPE;
_result INT;
BEGIN
EXECUTE 'TRUNCATE TABLE ' || _table_name;
UPDATE materialized_views
SET last_refresh = CURRENT_TIMESTAMP
WHERE table_name = _table_name;
RETURN 1;
END
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
换句话说,如果函数执行过程中发生错误,是否会回滚所做的更改?如果这不是默认行为,我怎样才能使函数事务性?
【问题讨论】:
-
@FrankHeikens 我的问题是“发生错误后更改是否会自动回滚”,而不是“如果我执行 ROLLBACK 会回滚更改”
-
@Don 请注意,
TRUNCATE有或曾经有一些有点时髦的事务行为。我不记得细节了;搜索 pgsql-general 档案。 -
是的,函数是事务性的,即使写成
LANGUAGE SQL。 -
@CraigRinger 据我所知,
TRUNCATE会忽略所有保存点并直接破坏您的表数据