Think twice
If at all possible, run invasive tests on a copy of the productive database, don't take the risk of breaking your productive DB. Even if all goes well, your presence won't go unnoticed. You may slow down or block concurrent activity.
The fastest way to create a copy within the same DB cluster - while there are no concurrent sessions:
CREATE DATABASE mydb_test TEMPLATE mydb;
See:
You avoid direct friction, blockage and breakage. But you still compete for resources when testing on the same server. Testing on a different server would avoid that, too ...
About ROLLBACK
In Postgres, the vast majority of all DML and DDL commands are fully transactional (can run inside a transaction block) and their effects can be rolled back. Just make sure you don't COMMIT
by accident.
Notable exceptions include: (none of these lists are comprehensive)
Things that don't even run in a transaction
There are some commands that cannot run in a transaction context to begin with. So they also cannot be rolled back. If you tried to include any of those in your transaction, Postgres would raise an exception before they even run. So nothing lost except the work that had been done already - and is rolled back.
Things that are not (or cannot be) rolled back
Those are the ones you really need to be aware of. Like:
Effects of the sequence manipulation functions setval()
and nextval()
, implicitly used by serial
and IDENTITY
columns. So expect gaps in serial numbers. See:
Anything written to log files
Anything returned to clients
Effects of dblink calls (or similar). See:
Corner cases
TRUNCATE
is not MVCC-safe. After truncation, the table will appear
empty to concurrent transactions, if they are using a snapshot taken
before the truncation occurred. See Section 13.6 for more
details.
TRUNCATE
is transaction-safe with respect to the data in the tables:
the truncation will be safely rolled back if the surrounding
transaction does not commit.
Related: