On 11.01.2012 16:59, Blazkowicz wrote:
> Не очень понятно какая у вас инфраструктура. JTA это абстрактный > механизм, поддерживающий множество транзакционных ресурсов. > JDBC транзакция это уже отдельная тема. Для начала расскажите как это у > вас должно работать. Потому что Connection в JDBC он не thread safe. И, > AFAIK, транзакция БД всегда привязана к одному соединению. > Поэтому в рамках одной транзакции всег обращения к базе придется > сериализовать в ручную. Соответственно становится не понятно зачем тогда > многопоточность?
Скорее всего ТС имеет в виду распределённую транзакцию (XA Transaction,
two-phase commit), а Connection в каждом потоке будет свой, взятый из
соответсвующим образом сконфигурированного DataSource.
Так можно сделать, конечно, но далеко не все драйвера и базы нормально
это поддерживают. Касательно спринга надо гуглить по "xa transaction
spring"
--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: [spring] Одна транзакция на несколько потоков
H>Скорее всего ТС имеет в виду распределённую транзакцию (XA Transaction, H>two-phase commit), а Connection в каждом потоке будет свой, взятый из H>соответсвующим образом сконфигурированного DataSource.
Да, блин. Че-т я тупанул. Ведь каждый Connection можно оформить как отельный XA ресурс. Сбило то что а автора одни сервлеты.
H>Так можно сделать, конечно, но далеко не все драйвера и базы нормально H>это поддерживают. Касательно спринга надо гуглить по "xa transaction H>spring"
Если контейнер сервлетов, то берем Atomicos http://www.atomikos.com/Documentation/SpringIntegration
Если полноценный J2EE контейнер, то прикручиваем через спринговый JtaTransactionManager.
Останется только вручную починать и заканчитьвать транзакцию. Хотя, возможно, Spring через @Async умеет.
Re[4]: [spring] Одна транзакция на несколько потоков
Стартуем глобальную транзакцию в рамках некоторого "основного" потока.
В рамках этой транзакции работают несколько "дочерних" потоков, "основной" поток ожидает завершения каждого из "дочерних".
После этого делается в рамках "основного" потока rollback или commit на глобальную транзакцию.
Знаю, что в JTA, похоже, это возможно — "Multiple threads may concurrently be associated with the same global transaction." — JTA spec v1.1, section 3.2, page 13, но я работаю с обычным сервлетом (и, соответственно, контейнером сервлетов) и не могу использовать Application Server.
Используется обычный спринговый DataSourceTransactionManager.
Как это сделать на нем?
Здравствуйте, A13x, Вы писали:
A>Хочется следующего:
A>Стартуем глобальную транзакцию в рамках некоторого "основного" потока. A>В рамках этой транзакции работают несколько "дочерних" потоков, "основной" поток ожидает завершения каждого из "дочерних". A>После этого делается в рамках "основного" потока rollback или commit на глобальную транзакцию.
A>Знаю, что в JTA, похоже, это возможно — "Multiple threads may concurrently be associated with the same global transaction." — JTA spec v1.1, section 3.2, page 13, но я работаю с обычным сервлетом (и, соответственно, контейнером сервлетов) и не могу использовать Application Server.
A>Используется обычный спринговый DataSourceTransactionManager. A>Как это сделать на нем?
Не очень понятно какая у вас инфраструктура. JTA это абстрактный механизм, поддерживающий множество транзакционных ресурсов.
JDBC транзакция это уже отдельная тема. Для начала расскажите как это у вас должно работать. Потому что Connection в JDBC он не thread safe. И, AFAIK, транзакция БД всегда привязана к одному соединению.
Поэтому в рамках одной транзакции всег обращения к базе придется сериализовать в ручную. Соответственно становится не понятно зачем тогда многопоточность?
Re[4]: [spring] Одна транзакция на несколько потоков
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, hrensgory, Вы писали:
... B>Останется только вручную починать и заканчитьвать транзакцию. Хотя, возможно, Spring через @Async умеет.
Вот с этим самая загвоздка.
Вопрос — как?
Не понимаю, как указать, что конкретный сервис будет использовать некоторую глобальную транзакцию.
Пните пожалуйста в правильном направлении
Re[3]: [spring] Одна транзакция на несколько потоков
Здравствуйте, A13x, Вы писали:
A>Вот с этим самая загвоздка. A>Вопрос — как? A>Не понимаю, как указать, что конкретный сервис будет использовать некоторую глобальную транзакцию. A>Пните пожалуйста в правильном направлении
Копать нужно в сторону исходников менеджера транзакций в Spring
Здравствуйте, A13x, Вы писали:
A>Хочется следующего:
A>Стартуем глобальную транзакцию в рамках некоторого "основного" потока. A>В рамках этой транзакции работают несколько "дочерних" потоков, "основной" поток ожидает завершения каждого из "дочерних". A>После этого делается в рамках "основного" потока rollback или commit на глобальную транзакцию.
Возможно, стоит посмотреть в сторону Spring Batch.