CREATETABLE xacttest (a smallint, b real); INSERTINTO xacttest VALUES
(56, 7.8),
(100, 99.097),
(0, 0.09561),
(42, 324.78); INSERTINTO xacttest (a, b) VALUES (777, 777.777);
END;
-- should retrieve one value-- SELECT a FROM xacttest WHERE a > 100;
BEGIN;
CREATETABLE disappear (a int4);
DELETEFROM xacttest;
-- should be empty SELECT * FROM xacttest;
ABORT;
-- should not exist SELECT oid FROM pg_class WHERE relname = 'disappear';
-- should have members again SELECT * FROM xacttest;
-- Test that transaction characteristics cannot be reset.
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT COUNT(*) FROM xacttest;
RESET transaction_isolation; -- error
END;
BEGIN TRANSACTION READ ONLY; SELECT COUNT(*) FROM xacttest;
RESET transaction_read_only; -- error
END;
BEGIN TRANSACTION DEFERRABLE; SELECT COUNT(*) FROM xacttest;
RESET transaction_deferrable; -- error
END;
CREATE FUNCTION errfunc() RETURNS int LANGUAGE SQLAS'SELECT 1' SET transaction_read_only = on; -- error
-- Read-only tests
CREATETABLE writetest (a int); CREATE TEMPORARY TABLE temptest (a int);
BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY, DEFERRABLE; -- ok SELECT * FROM writetest; -- ok SET TRANSACTION READWRITE; --fail COMMIT;
BEGIN; SET TRANSACTION READ ONLY; -- ok SET TRANSACTION READWRITE; -- ok SET TRANSACTION READ ONLY; -- ok SELECT * FROM writetest; -- ok
SAVEPOINT x; SET TRANSACTION READ ONLY; -- ok SELECT * FROM writetest; -- ok SET TRANSACTION READ ONLY; -- ok SET TRANSACTION READWRITE; --fail COMMIT;
BEGIN; SET TRANSACTION READWRITE; -- ok
SAVEPOINT x; SET TRANSACTION READWRITE; -- ok SET TRANSACTION READ ONLY; -- ok SELECT * FROM writetest; -- ok SET TRANSACTION READ ONLY; -- ok SET TRANSACTION READWRITE; --fail COMMIT;
BEGIN; SET TRANSACTION READWRITE; -- ok
SAVEPOINT x; SET TRANSACTION READ ONLY; -- ok SELECT * FROM writetest; -- ok
ROLLBACK TO SAVEPOINT x; SHOW transaction_read_only; -- off
SAVEPOINT y; SET TRANSACTION READ ONLY; -- ok SELECT * FROM writetest; -- ok RELEASE SAVEPOINT y; SHOW transaction_read_only; -- off COMMIT;
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
DROPTABLE writetest; -- fail INSERTINTO writetest VALUES (1); -- fail SELECT * FROM writetest; -- ok DELETEFROM temptest; -- ok UPDATE temptest SET a = 0FROM writetest WHERE temptest.a = 1AND writetest.a = temptest.a; -- ok
PREPARE test ASUPDATE writetest SET a = 0; -- ok
EXECUTE test; -- fail SELECT * FROM writetest, temptest; -- ok CREATETABLE test ASSELECT * FROM writetest; -- fail
START TRANSACTION READWRITE; DROPTABLE writetest; -- ok COMMIT;
-- Subtransactions, basic tests -- create & drop tables SET SESSION CHARACTERISTICS AS TRANSACTION READWRITE; CREATETABLE trans_foobar (a int);
BEGIN; CREATETABLE trans_foo (a int);
SAVEPOINT one; DROPTABLE trans_foo; CREATETABLE trans_bar (a int);
ROLLBACK TO SAVEPOINT one; RELEASE SAVEPOINT one;
SAVEPOINT two; CREATETABLE trans_baz (a int); RELEASE SAVEPOINT two; dropTABLE trans_foobar; CREATETABLE trans_barbaz (a int); COMMIT; -- should exist: trans_barbaz, trans_baz, trans_foo SELECT * FROM trans_foo; -- should be empty SELECT * FROM trans_bar; -- shouldn't exist SELECT * FROM trans_barbaz; -- should be empty SELECT * FROM trans_baz; -- should be empty
-- inserts
BEGIN; INSERTINTO trans_foo VALUES (1);
SAVEPOINT one; INSERTinto trans_bar VALUES (1);
ROLLBACK TO one; RELEASE SAVEPOINT one;
SAVEPOINT two; INSERTinto trans_barbaz VALUES (1); RELEASE two;
SAVEPOINT three;
SAVEPOINT four; INSERTINTO trans_foo VALUES (2); RELEASE SAVEPOINT four;
ROLLBACK TO SAVEPOINT three; RELEASE SAVEPOINT three; INSERTINTO trans_foo VALUES (3); COMMIT; SELECT * FROM trans_foo; -- should have 1 and 3 SELECT * FROM trans_barbaz; -- should have 1
-- test whole-tree commit
BEGIN;
SAVEPOINT one; SELECT trans_foo;
ROLLBACK TO SAVEPOINT one; RELEASE SAVEPOINT one;
SAVEPOINT two; CREATETABLE savepoints (a int);
SAVEPOINT three; INSERTINTO savepoints VALUES (1);
SAVEPOINT four; INSERTINTO savepoints VALUES (2);
SAVEPOINT five; INSERTINTO savepoints VALUES (3);
ROLLBACK TO SAVEPOINT five; COMMIT; COMMIT; -- should not be in a transaction block SELECT * FROM savepoints;
-- test whole-tree rollback
BEGIN;
SAVEPOINT one; DELETEFROM savepoints WHERE a=1; RELEASE SAVEPOINT one;
SAVEPOINT two; DELETEFROM savepoints WHERE a=1;
SAVEPOINT three; DELETEFROM savepoints WHERE a=2;
ROLLBACK; COMMIT; -- should not be in a transaction block
SELECT * FROM savepoints;
-- test whole-tree commit on an aborted subtransaction
BEGIN; INSERTINTO savepoints VALUES (4);
SAVEPOINT one; INSERTINTO savepoints VALUES (5); SELECT trans_foo; COMMIT; SELECT * FROM savepoints;
BEGIN; INSERTINTO savepoints VALUES (6);
SAVEPOINT one; INSERTINTO savepoints VALUES (7); RELEASE SAVEPOINT one; INSERTINTO savepoints VALUES (8); COMMIT; -- rows 6 and 8 should have been created by the same xact SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=6AND b.a=8; -- rows 6 and 7 should have been created by different xacts SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=6AND b.a=7;
BEGIN; INSERTINTO savepoints VALUES (9);
SAVEPOINT one; INSERTINTO savepoints VALUES (10);
ROLLBACK TO SAVEPOINT one; INSERTINTO savepoints VALUES (11); COMMIT; SELECT a FROM savepoints WHERE a in (9, 10, 11); -- rows 9 and 11 should have been created by different xacts SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=9AND b.a=11;
BEGIN; INSERTINTO savepoints VALUES (12);
SAVEPOINT one; INSERTINTO savepoints VALUES (13);
SAVEPOINT two; INSERTINTO savepoints VALUES (14);
ROLLBACK TO SAVEPOINT one; INSERTINTO savepoints VALUES (15);
SAVEPOINT two; INSERTINTO savepoints VALUES (16);
SAVEPOINT three; INSERTINTO savepoints VALUES (17); COMMIT; SELECT a FROM savepoints WHERE a BETWEEN12AND17;
BEGIN; INSERTINTO savepoints VALUES (18);
SAVEPOINT one; INSERTINTO savepoints VALUES (19);
SAVEPOINT two; INSERTINTO savepoints VALUES (20);
ROLLBACK TO SAVEPOINT one; INSERTINTO savepoints VALUES (21);
ROLLBACK TO SAVEPOINT one; INSERTINTO savepoints VALUES (22); COMMIT; SELECT a FROM savepoints WHERE a BETWEEN18AND22;
DROPTABLE savepoints;
-- only in a transaction block:
SAVEPOINT one;
ROLLBACK TO SAVEPOINT one; RELEASE SAVEPOINT one;
-- Only "rollback to" allowed in aborted state
BEGIN;
SAVEPOINT one; SELECT0/0;
SAVEPOINT two; -- ignored till the end of ... RELEASE SAVEPOINT one; -- ignored till the end of ...
ROLLBACK TO SAVEPOINT one; SELECT1; COMMIT; SELECT1; -- this should work
-- check non-transactional behavior of cursors
BEGIN; DECLARE c CURSORFORSELECT unique2 FROM tenk1 ORDERBY unique2;
SAVEPOINT one; FETCH10FROM c;
ROLLBACK TO SAVEPOINT one; FETCH10FROM c; RELEASE SAVEPOINT one; FETCH10FROM c;
CLOSE c; DECLARE c CURSORFORSELECT unique2/0FROM tenk1 ORDERBY unique2;
SAVEPOINT two; FETCH10FROM c;
ROLLBACK TO SAVEPOINT two; -- c is now dead to the world ... FETCH10FROM c;
ROLLBACK TO SAVEPOINT two; RELEASE SAVEPOINT two; FETCH10FROM c; COMMIT;
-- -- Check that "stable" functions are really stable. They should not be -- able to see the partial results of the calling query. (Ideally we would -- also check that they don't see commits of concurrent transactions, but -- that's a mite hard to do within the limitations of pg_regress.) -- select * from xacttest;
createorreplace function max_xacttest() returns smallint language sqlas 'select max(a) from xacttest' stable;
begin; update xacttest set a = max_xacttest() + 10where a > 0; select * from xacttest;
rollback;
-- But a volatile function can see the partial results of the calling query createorreplace function max_xacttest() returns smallint language sqlas 'select max(a) from xacttest' volatile;
begin; update xacttest set a = max_xacttest() + 10where a > 0; select * from xacttest;
rollback;
-- Now the same test with plpgsql (since it depends on SPI which is different) createorreplace function max_xacttest() returns smallint language plpgsql as 'begin return max(a) from xacttest; end' stable;
begin; update xacttest set a = max_xacttest() + 10where a > 0; select * from xacttest;
rollback;
createorreplace function max_xacttest() returns smallint language plpgsql as 'begin return max(a) from xacttest; end' volatile;
begin; update xacttest set a = max_xacttest() + 10where a > 0; select * from xacttest;
rollback;
-- test case for problems with dropping an open relation during abort
BEGIN;
savepoint x; CREATETABLE koju (a INTUNIQUE); INSERTINTO koju VALUES (1); INSERTINTO koju VALUES (1);
rollback to x;
CREATETABLE koju (a INTUNIQUE); INSERTINTO koju VALUES (1); INSERTINTO koju VALUES (1);
ROLLBACK;
-- test case for problems with revalidating an open relation during abort create function inverse(int) returns float8as
$$
begin analyze revalidate_bug; return1::float8/$1;
exception when division_by_zero thenreturn0;
end$$ language plpgsql volatile;
droptable revalidate_bug; drop function inverse(int);
-- verify that cursors created during an aborted subtransaction are -- closed, but that we do not rollback the effect of any FETCHs -- performed in the aborted subtransaction
begin;
savepoint x; createtable trans_abc (a int); insertinto trans_abc values (5); insertinto trans_abc values (10); declare foo cursorforselect * from trans_abc; fetchfrom foo;
rollback to x;
-- Test for proper cleanup after a failure in a cursor portal -- that was created in an outer subtransaction CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS
$$ begin return1/x; end $$;
CREATE FUNCTION create_temp_tab() RETURNS text
LANGUAGE plpgsql AS $$
BEGIN CREATE TEMP TABLE new_table (f1 float8); -- case of interest is that we fail while holding an open -- relcache reference to new_table INSERTINTO new_table SELECT invert(0.0); RETURN'foo';
END $$;
BEGIN; DECLARE ok CURSORFORSELECT * FROM int8_tbl; DECLARE ctt CURSORFORSELECT create_temp_tab(); FETCH ok;
SAVEPOINT s1; FETCH ok; -- should work FETCH ctt; -- error occurs here
ROLLBACK TO s1; FETCH ok; -- should work FETCH ctt; -- must be rejected COMMIT;
DROP FUNCTION create_temp_tab(); DROP FUNCTION invert(x float8);
-- Tests for AND CHAIN
CREATETABLE trans_abc (a int);
-- set nondefault value so we have something to override below SET default_transaction_read_only = on;
START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READWRITE, DEFERRABLE; SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; INSERTINTO trans_abc VALUES (1); INSERTINTO trans_abc VALUES (2); COMMITAND CHAIN; -- TBLOCK_END SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; INSERTINTO trans_abc VALUES ('error'); INSERTINTO trans_abc VALUES (3); -- check it's really aborted COMMITAND CHAIN; -- TBLOCK_ABORT_END SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; INSERTINTO trans_abc VALUES (4); COMMIT;
START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READWRITE, DEFERRABLE; SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable;
SAVEPOINT x; INSERTINTO trans_abc VALUES ('error'); COMMITAND CHAIN; -- TBLOCK_ABORT_PENDING SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; INSERTINTO trans_abc VALUES (5); COMMIT;
START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READWRITE, DEFERRABLE; SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable;
SAVEPOINT x; COMMITAND CHAIN; -- TBLOCK_SUBCOMMIT SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; COMMIT;
START TRANSACTION ISOLATION LEVEL READ COMMITTED, READWRITE, DEFERRABLE; SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable;
SAVEPOINT x; COMMITAND CHAIN; -- TBLOCK_SUBCOMMIT SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; COMMIT;
-- different mix of options just for fun
START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READWRITE, NOT DEFERRABLE; SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; INSERTINTO trans_abc VALUES (6);
ROLLBACK AND CHAIN; -- TBLOCK_ABORT_PENDING SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable; INSERTINTO trans_abc VALUES ('error');
ROLLBACK AND CHAIN; -- TBLOCK_ABORT_END SHOW transaction_isolation; SHOW transaction_read_only; SHOW transaction_deferrable;
ROLLBACK;
-- not allowed outside a transaction block COMMITAND CHAIN; -- error
ROLLBACK AND CHAIN; -- error
SELECT * FROM trans_abc ORDERBY1;
RESET default_transaction_read_only;
DROPTABLE trans_abc;
-- Test assorted behaviors around the implicit transaction block created -- when multiple SQL commands are sent in a single Query message. These -- tests rely on the fact that psql will not break SQL commands apart at a -- backslash-quoted semicolon, but will send them as one Query.
create temp table i_table (f1 int);
-- psql will show all results of a multi-statement Query SELECT1\; SELECT2\; SELECT3;
-- this implicitly commits: insertinto i_table values(1)\; select * from i_table; -- 1/0 error will cause rolling back the whole implicit transaction insertinto i_table values(2)\; select * from i_table\; select1/0; select * from i_table;
rollback; -- we are not in a transaction at this point
-- can use regular begin/commit/rollback within a single Query
begin\; insertinto i_table values(3)\; commit;
rollback; -- we are not in a transaction at this point
begin\; insertinto i_table values(4)\; rollback;
rollback; -- we are not in a transaction at this point
-- begin converts implicit transaction into a regular one that -- can extend past the end of the Query select1\; begin\; insertinto i_table values(5); commit; select1\; begin\; insertinto i_table values(6);
rollback;
-- commit in implicit-transaction state commits but issues a warning. insertinto i_table values(7)\; commit\; insertinto i_table values(8)\; select1/0; -- similarly, rollback aborts but issues a warning. insertinto i_table values(9)\; rollback\; select2;
select * from i_table;
rollback; -- we are not in a transaction at this point
-- implicit transaction block is still a transaction block, for e.g. VACUUM SELECT1\; VACUUM; SELECT1\; COMMIT\; VACUUM;
-- we disallow savepoint-related commands in implicit-transaction state SELECT1\; SAVEPOINT sp; SELECT1\; COMMIT\; SAVEPOINT sp;
ROLLBACK TO SAVEPOINT sp\; SELECT2; SELECT2\; RELEASE SAVEPOINT sp\; SELECT3;
-- but this is OK, because the BEGIN converts it to a regular xact SELECT1\; BEGIN\; SAVEPOINT sp\; ROLLBACK TO SAVEPOINT sp\; COMMIT;
-- Tests for AND CHAIN in implicit transaction blocks
SET TRANSACTION READ ONLY\; COMMITAND CHAIN; -- error SHOW transaction_read_only;
SET TRANSACTION READ ONLY\; ROLLBACK AND CHAIN; -- error SHOW transaction_read_only;
-- START TRANSACTION + COMMIT/ROLLBACK AND CHAIN
START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERTINTO trans_abc VALUES (15)\; COMMITAND CHAIN; -- 15 ok SHOW transaction_isolation; -- transaction is active at this point COMMIT;
START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERTINTO trans_abc VALUES (16)\; ROLLBACK AND CHAIN; -- 16 ok SHOW transaction_isolation; -- transaction is active at this point
ROLLBACK;
SET default_transaction_isolation = 'read committed';
-- START TRANSACTION + COMMIT/ROLLBACK + COMMIT/ROLLBACK AND CHAIN
START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERTINTO trans_abc VALUES (17)\; COMMIT\; INSERTINTO trans_abc VALUES (18)\; COMMITAND CHAIN; -- 17 commit, 18 error SHOW transaction_isolation; -- out of transaction block
START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERTINTO trans_abc VALUES (19)\; ROLLBACK\; INSERTINTO trans_abc VALUES (20)\; ROLLBACK AND CHAIN; -- 19 rollback, 20 error SHOW transaction_isolation; -- out of transaction block
RESET default_transaction_isolation;
SELECT * FROM trans_abc ORDERBY1;
DROPTABLE trans_abc;
-- TRANSACTION SNAPSHOT -- Incorrect identifier.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT 'Incorrect Identifier';
ROLLBACK; -- Correct identifier, missing file.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT 'FFF-FFF-F';
ROLLBACK;
-- Test for successful cleanup of an aborted transaction at session exit. -- THIS MUST BE THE LAST TEST IN THIS FILE.
begin; select1/0;
rollback to X;
-- DO NOT ADD ANYTHING HERE.
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.2 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.