Transactional annotation signals Spring to create a proxy around the created bean. Spring uses AOP under the hood to delegate transaction-related activities to the underlying TransactionManager. AOP code is going to be invoked regardless you actually use DB access in your method or not.
Having said that, there are issues regarding self-invocation of transactional methods, but this is the shortcoming of Spring Syle AOP at large.
I suggest you take a look at Spring proxies, in which cases a bean is proxied and when it is not, and also get a general feel for AOP since it is used heavily under the hood in Spring.