| PostgreSQL actually treats every SQL statement as being executed | within a transaction. If you do not issue a BEGIN command, then | each individual statement has an implicit BEGIN and (if | successful) COMMIT wrapped around it.
Combine this with the fact that a function can only run in the context of a command, like:
SELECT func_name();
You have your guarantee -- as long as you understand the possible action of subtransactions (like savepoints). -Kevin