Для веб-приложения MVC Spring @Transactional должен идти на контроллере или сервисе?

Для WebApplicationContext я должен поставить@Transactional аннотации в контроллере или в сервисах? Весенние документы меня немного смущают.

Вот мой web.xml:



  Alpha v0.02
  
    spring
    org.springframework.web.servlet.DispatcherServlet
    1
  

  
    spring
    *.htm
  

  
    spring
    *.json
  

  
    index.jsp
  

Вот мой application-context.xml, определяющий весенний сервлет-диспетчер:




    
    
    

    

    
        
        
    

     
        
        
        
        
    

    
        
        
    

    
      
      
        

Вот'Сервисный интерфейс:

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

Вот's реализация сервиса:

@Service
public class LayerServiceImpl implements LayerService {

    @Autowired
    public LayerDAO layerDAO;

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

И здесь's мой контроллер:

@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);
    }
}

Документация Spring меня немного смутила. Кажется, это указывает на то, что использование WebApplicationContext означает, что для аннотаций @Transactional будут проверяться только контроллеры, а не сервисы. Между тем я вижу множество рекомендаций сделать сервисы транзакционными, а не контроллерами. Я'Я думаю, что с помощью в нашем spring-servlet.xml выше, так как он включает пакеты служб, означает, что службы являются частью контекста и, следовательно, будут "расследованы» для транзакционных аннотаций. Это точно?

Вот'С рекламной информацией Spring, которая запутала меня:

@EnableTransactionManagement и ищет @Transactional только для bean-компонентов в том же контексте приложения, в котором они определены. Это означает, что если вы помещаете управляемую аннотацией конфигурацию в WebApplicationContext для DispatcherServlet, она проверяет только бины @Transactional в ваших контроллерах, а не ваши услуги.

Кроме того, есть ли какие-либо последствия для производительности или "вредность» если я определяю метод контроллера как транзакционный, и он вызывает транзакционный метод в другом классе? Моя догадка - нет, основываясь на документации, но я бы с удовольствием проверил это.

Ответы на вопрос(3)

Ваш ответ на вопрос