Может ли пружина управляемая транзакция пережить несколько запросов-ответов? - PullRequest
3 голосов
/ 09 июня 2011

В настоящее время я работаю с использованием jsf 2, jpa 2 и spring 3.

Мне кажется, я вполне понимаю использование @Transactional и его распространение, но, тем не менее, это относится только к одному потоку, который в моем случае является одним ответом на запрос моего веб-приложения

В основном мне нужно:

  1. клиент удаленной бизнес-службы - это тот, кто инициирует и завершает транзакцию
  2. spring сделает перевод исключения, если возникнет какое-либо исключение

Вот пример, который, мы надеемся, может описать намерение:

  1. клиент (при условии, что это мобильное устройство, а не веб-приложение) просит сервер создать новую транзакцию
  2. сервер возвращает идентификатор транзакции
  3. клиент вызывает serviceA, передавая ID транзакции для использования
  4. serviceA выполняется с использованием транзакции (на основе переданного идентификатора транзакции) и завершается, но транзакция не зафиксирована
  5. клиент продолжает вызывать serviceB, передавая тот же идентификатор транзакции для использования
  6. serviceB выполняется с использованием предыдущей транзакции, инициированной serviceA
  7. если serviceB работает правильно, тогда клиент может попросить сервер выполнить фиксацию на основе ID транзакции
  8. если serviceB работает с исключением, то Spring может выполнить преобразование sql исключения

Возможно ли это?

Спасибо!

1 Ответ

2 голосов
/ 10 июня 2011

Надеюсь, вам на самом деле не нужна такая длинная транзакция ... Обычно это довольно плохая идея, поскольку транзакции должны быть как можно более короткими (просто Google эта мантра для объяснений, если вы сомневаетесь в этом).

Вместо этого, возможно, вам просто понадобятся «длинные разговоры»: в основном вы работаете с отсоединенными сущностями по нескольким вызовам / запросам (делая доступ только для чтения к вашемубазы данных), затем вы присоединяете их (со своими изменениями), когда будете готовы зафиксировать свой tx.

В любом случае, @Transactional здесь действительно бесполезен, и я не знаю о каких-либомеханизм, позволяющий достичь того, что вы описываете.

Возможно, стоит рассмотреть возможность использования пружинного веб-потока: он предоставляет простые в использовании функции, связанные с беседой, и должен очень хорошо работать в вашем контексте (JPA / JSF) ...

См. Соответствующее обсуждение здесь .

HTH

...