@BenMorel naming transaction is for identifying transactions and being able to commit a named transaction/roll back to a certain nested transaction or more theoretically grouping certain database operations into one named transaction. I know that some database vendors support this even natively, for example [SQL Server](http://technet.microsoft.com/en-us/library/ms188929.aspx). Though this is not really supported by Doctrine, yet AFAIK.

Read only transactions are indeed intended for `SELECT` only queries. This is supported natively by Oracle for example and acts as kind of a constraint on that transaction which statements you can run. It enables transaction-level read consistency. From the Oracle documentation:

> All subsequent queries in that transaction see only changes that were committed before the transaction began. Read-only transactions are useful for reports that run multiple queries against one or more tables while other users update these same tables.

Transaction propagation is a concept of telling the transaction manager what kind of transaction you need. The idea behind is to have a `getTransaction($transactionDefinition)` on the transaction manager. Then telling in the definition for example you require an active transaction, the transaction manager looks if there is already one managed and returns that, otherwise creates a new one and returns that. Or if you say you require a new transaction, it always returns a new transaction even though there might be already one active. Please see [this article](http://java.dzone.com/articles/j2ee-transactions-explained) for better understanding.