Many moons ago (2004, which now seems like forever), I was somewhat circumspect about the transaction APIs in Spring. Not so much that I thought the model was bad: it seemed like a nice improvement over EJB. But my concern was that since JTA was usually hidden in the bowels of application servers, there may be equally hidden assumptions that the "container" logic needed to be aware of, especially for managing errors.
Whether I was right or wrong (at the time Juergen, I think, disagreed sharply), the fact is that the major application server vendors have made sure this use case works as coded. In fact, Oracle has also provided an adaptive layer to make working with transactions in Spring even more straightforward for OC4J users. This support will be packaged in the Spring core, I'm glad to say.
We're thinking of doing an update to Java Transaction Processing: not only do I want to add a correction on this topic, I very much want to do a chapter on the Spring framework as an alternative to EJB and to provide thorough coverage of the additional transaction control semantics that Spring introduces.