For those interested, we tracked down root cause on this yesterday. The issue stemmed from how greedily we were component scanning in the servlet context.
Before:
Code:
applicationContext.xml
<tx:annotation-driven proxy-target-class="true" transaction-manager="txManager" />
<context:component-scan base-package="com.foo.bar"/>
<context:annotation-config />
servletContext.xml
<context:component-scan base-package="com.foo.bar" />
While running with Spring 2.5.6 we had no issues with this configuration and only after upgrading to Spring 3.0.5 did our mistake become apparent. I believe the result of this configuration is the component-scan in the servlet context is not only scanning the @Controllers, but it's going to re-scan all of our @Service/@Repo/etc components creating (non transactional) instances of them in this context. In this case, any of these dependencies wired into the controllers would result in non-transactional activity. At least, this is my understanding but I'd love to know if I'm off a little and/or what was changed between 2.5.6 and 3.0.5 that would have surfaced this problem.
At any rate, the fix was simple -- only scan for @Controller.
Code:
<context:component-scan base-package="com.foo.bar" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>