It sounds like you are understanding the concept of transactions just fine. The problem is in assuming that everything you're doing is transactional, which it's not.
When you use CMT, the container (WebLogic in this case) makes use of JTA (
Java Transaction API) to manage and enlist resources in the transaction -- things like databases and message queues. Method calls themselves, logging, and return values are not transactional resources.
Note that it would be possible to create a logging library that was transactional, but typically you want a message logged whether or not the transaction is committed.
To
test this out, you can perform data-modification actions through a JTA-capable
JDBC Connection and see that they are rolled back appropriately.