I get your point, but there is value in delegating to the database--how do I roll back an external state machine?
Basically you encapsulate whatever you need to do with the database in objects (logic + parameters). And you describe for these objects not only the logic for updating the database (forward), but also for reverting the database to its previous state (rollback).
Or you could delegate all this to the database, which already has its own transaction protocol.