Para la aplicación web de MVC Spring, ¿debería @Transactional ir en el controlador o servicio?

Para WebApplicationContext, debo poner@Transactional ¿Anotaciones en el controlador o en servicios? Los documentos de primavera me tienen un poco confundido.

Aquí está mi web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Alpha v0.02</display-name>
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>*.json</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Aquí está mi aplicación-contexto.xml que define un servlet de despachador de resortes:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/beans    
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:annotation-config />
    <mvc:annotation-driven />
    <tx:annotation-driven />

    <context:component-scan base-package="com.visitrend" />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

     <bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="org.postgresql.Driver" />
        <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/postgres" />
        <property name="user" value="someuser" />
        <property name="password" value="somepasswd" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:test.hibernate.cfg.xml" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="dataSource" ref="dataSource" />
      <property name="sessionFactory" ref="sessionFactory" />
    </bean>    
</beans>

Aquí hay una interfaz de servicio:

public interface LayerService {
    public void createLayer(Integer layerListID, Layer layer);
}

Aquí hay una implementación de servicio:

@Service
public class LayerServiceImpl implements LayerService {

    @Autowired
    public LayerDAO layerDAO;

    @Transactional
    @Override
    public void createLayer(Integer layerListID, Layer layer) {
        layerDAO.createLayer(layerListID, layer);
    }
}

Y aquí está mi controlador:

@Controller
public class MainController {

    @Autowired
    private LayerService layerService;

    @RequestMapping(value = "/addLayer.json", method = RequestMethod.POST)
    public @ResponseBody
    LayerListSetGroup addLayer(@RequestBody JSONLayerFactory request) {
        layerService.createLayer(request.getListId(), request.buildLayer());
        return layerService.readLayerListSetGroup(llsgID);
    }
}

La documentación de primavera me tiene un poco confundido. Parece indicar que el uso de WebApplicationContext significa que solo se investigarán los controladores para las anotaciones @Transactional y no los servicios. Mientras tanto veo toneladas de recomendaciones para hacer servicios transaccionales y no controladores. Estoy pensando que usando<context:component-scan base-package="com..." /> en nuestro spring-servlet.xml anterior, de modo que incluya los paquetes de servicios, significa que los servicios son parte del contexto y, por lo tanto, serán "investigados" para las anotaciones transaccionales. ¿Es esto correcto?

Aquí está la propaganda de documentación de primavera que me confundió:

@EnableTransactionManagement y solo busca @Transactional en beans en el mismo contexto de aplicación en el que están definidos. Esto significa que, si coloca la configuración controlada por anotación en un WebApplicationContext para un DispatcherServlet, solo verifica los beans @Transactional en sus controladores, y no sus servicios

Además, ¿hay alguna implicación de rendimiento o "maldad" si defino un método de controlador como transaccional, y se llama un método transaccional en otra clase? Mi corazonada es no, según la documentación, pero me encantaría la validación de eso.

Respuestas a la pregunta(3)

Su respuesta a la pregunta