Spring @Transactional параллелизм - PullRequest
       23

Spring @Transactional параллелизм

2 голосов
/ 14 сентября 2010

<code>
class MyService {</p>

<p>public void a() {
     synchronized(somekey) {
        b(); 
     }
  }</p>

<p>@Transactional(propagation = Propagation.REQUIRES_NEW)
  public void b() {
    ...do DB works...
  }
}

Моя цель

Когда я вызываю метод () извне, транзакция не работает.

Есть предложения?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 14 сентября 2010

Если вы не используете переплетение кода, это не может работать.

По умолчанию Spring обрабатывает транзакции через AOP-прокси . Вызов транзакционного метода выглядит следующим образом:

 caller --> ProxyClass.a() --> YourClass.a()

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

 caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()

Если вы не хотите использовать AspectJ, вы можете получить прокси-объект, используя AopContext.currentProxy().

1 голос
/ 14 сентября 2010

Не уверен на 100%.Я думаю, что все вызовы @Transactional должны выполняться в том же потоке , в котором началась транзакция.Я точно знаю, что @ Transactional не работает между потоками .(Я думаю, по замыслу)

0 голосов
/ 14 сентября 2010

Вызов метода для b () является внутренним вызовом, а не транзакционным прокси, как сказал Хеннинг.

Все объясняется в этом сообщении в блоге.

0 голосов
/ 14 сентября 2010

Если вы хотите вызвать b() внутри a() и хотите сделать b() транзакционным, вы должны поместить его в отдельный класс.

0 голосов
/ 14 сентября 2010

Мне любопытно, какова природа ключа.Почему сервис генерирует это?Разве альтернативный дизайн не поместил бы это в базу данных?

Трудно сказать точно, что не так без сообщения об ошибке.

...