The transaction implementation is using the Unit Of Work and the UnitOfWorkProtocol aspect to achive completely transparent transaction demarcation. You can registers one or many listeners to the Unit Of Work which will be called upon commit, rollback etc.

Each transaction implementation consists of two parts:

A transaction manager which has to implement the org.codehaus.aware.transaction.TransactionManager interface

A Unit Of Work listener, which has to implement the org.codehaus.aware.unitofwork.UnitOfWorkListener interface

See the UnitOfWorkProtocol for details on how to define the Unit Of Work aspect, e.g. on which methods a new transaction should be started, committed and roll backed etc.

The transaction implementations work great in conjunction with the Persistence components, in which it can for example make them aware of JTA two-phase commit transactions etc. You just register your listeners in the Unit Of Work and the complete transaction will not be committed until all listeners have agreed on that.