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.
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.
<tx:annotation-driven proxy-target-class="true" transaction-manager="txManager" />
<context:component-scan base-package="com.foo.bar" />
At any rate, the fix was simple -- only scan for @Controller.
<context:component-scan base-package="com.foo.bar" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>