Well, basically stored procedures are atomic in nature and performed as a single transaction.
CREATE TABLE xxx (id int PRIMARY KEY); CREATE OR REPLACE FUNCTION f() RETURNS void AS $$ DECLARE len int; BEGIN RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); INSERT INTO xxx VALUES (1); RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); INSERT INTO xxx VALUES (2); RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); SELECT COUNT(*) FROM xxx INTO len; RAISE NOTICE 'Number of records: %', len; RAISE NOTICE 'Transaction ID: %', TXID_CURRENT();
Then try calling f() from psql .
stackoverflow=# show autocommit; autocommit ------------ on (1 row) stackoverflow=# SELECT f(); NOTICE: Transaction ID: 15086 NOTICE: Transaction ID: 15086 NOTICE: Transaction ID: 15086 NOTICE: Number of records: 2 NOTICE: Transaction ID: 15086 ERROR: duplicate key value violates unique constraint "xxx_pkey" DETAIL: Key (id)=(3) already exists. CONTEXT: SQL statement "UPDATE xxx SET id = 3" PL/pgSQL function f() line 20 at SQL statement stackoverflow=# SELECT * FROM xxx; id ---- (0 rows)
source share