Правильно ли я понимаю поведение Spring @Transactional? - PullRequest
1 голос
/ 04 марта 2010

Я надеялся, что кто-нибудь сможет подтвердить мое понимание поведения транзакций в сервисе Spring.

Во-первых, я прав, полагая, что при использовании TransactionManager все службы, которые приводят к сохранению базы данных, должны вызываться из метода @Transactional, чтобы обновление сохранялось до БД?

Например, учитывая следующий класс:

class MyService
{
   CustomerImporter customerImporter
   CustomerDAO customerDAO

   public void updateCustomer(Customer customer)
   {
       customerDAO.update(customer)
   }

   public List<Customer> importCustomers(String url)
   {
       customerImporter.importCustomers(url);
   }
   return customerDAO.getFromURL(url);
}

Если updateCustomer не @Transactional, будет ли метод иметь какой-либо эффект?

Кроме того, если на CustomerImporter метод importCustomers() помечен @Transactional, а MyService - нет, будет ли обновление сохранено в базе данных?

Ответы [ 2 ]

4 голосов
/ 04 марта 2010

Во-первых, правильно ли я верю что при использовании TransactionManager, все услуги, которые приводят к постоянство в базе данных должно быть вызывается изнутри @Transactional метод для обновления к сохраняться в БД?

Это не тот случай, нет. Без аннотации обновления базы данных будут выполняться без транзакций, но они все равно будут происходить.

Если updateCustomer нет @Transactional, будет ли метод иметь любой эффект?

Кроме того, если на CustomerImporter помечен метод importCustomers () @Transactional, но MyService нет, будет ли обновление сохранено до базы данных?

На самом деле, между @Transactional и DAO нет магической ассоциации. Аннотация определяет границу транзакции, и Spring будет запускать / откатывать / фиксировать транзакцию каждый раз при входе или выходе из метода, помеченного @Transactional.

Если вы выполняете аннотированный @Transactional метод, и этот метод затем вызывает другой метод в другом классе, и тот вызывает другой, который в конечном итоге выполняет какую-то работу с базой данных, тогда вы все еще находитесь внутри транзакции. Аннотации могут быть там, где это имеет смысл для вас. Например, вы можете поместить @Transactional на свои контроллеры MVC, если захотите, это все равно будет работать, вы просто перемещаете границу транзакции «вверх».

2 голосов
/ 04 марта 2010

Да, вы правы - вам нужно @Transactional + <tx:annotation-driven />, чтобы транзакции работали.

Другой способ заключается в использовании возможностей <aop: Spring в XML.

Что касается вашего второго вопроса, он будет выполнен в рамках той же транзакции. Посмотрите на распространение транзакции , чтобы узнать, как это поведение определяется в транзакционных методах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...