In Oracle, the TRUNCATE statement terminates the current transaction before it executes (with a COMMIT, I believe). Then, because it is treated like a DDL statement, the TRUNCATE executes without possibility of rollback. And then a new transaction is started.
As I understand it, the behaviour of other DDL statements in Oracle is somewhat similar.
Some DBMS provide transactional DDL statements - and very useful it is, too.