To answer the specific question, I don't think there is any way to set up a transaction in the database sense that will do what you want. Think about it and you'll see why: there's no guarantee that the various parts of your multi-page operation will be handled by the same process. Or quite likely even the same server. If the request spans database connections, as it will in this situation, the uncommitted parts from one connection will be invisible to the other connections.
As well as the ideas already mentioned, I'd consider using one or more "staging" tables to hold the incomplete data already entered. Then when the user is finished, a single transaction can apply the data to the permanent tables and remove the staging data. Incomplete data can be cleared out on an age criterion by a background process once you're confident the session has been terminated, or held until the user returns, should that better meet your requirements.
I'd lean towards this approach particularly if I expected to have regular incomplete transactions, because this way I don't have to deal with incomplete data in my main models.