как разделить одну транзакцию между несколькими потоками

Мы встречаемся со сценарием, который работает с многопоточностью.

В основном потоке выполните некоторую логику и обновите базу данных, в какой-то момент он вызовет другую службу для обновления базы данных, которая запускается в другом потоке.

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

Но поработав несколько дней, я обнаружил, что в некоторых сообщениях говорится, что JTA не поддерживает многопоточность. в настоящее время мы используем Bitronix в качестве поставщика JTA, знает ли кто-нибудь, поддерживает ли Bitronix многопоточность в одной транзакции? или есть ли какой-либо другой поставщик JTA, поддерживающий это (автономный поставщик JTA, а не контейнер J2EE)?


person Scarlett    schedule 05.08.2011    source источник


Ответы (1)


«Несколько потоков могут одновременно быть связаны с одной и той же глобальной транзакцией». - JTA spec v1.1, раздел 3.2, стр. 13.

JBossTS справится с этим без проблем. Если оставить в стороне проверенное поведение транзакции, проблема на самом деле не в диспетчере транзакций. Вам также потребуется правильная обработка соединений с менеджером ресурсов, то есть с базой данных. Если вы разделяете одно соединение между потоками, вы не обязательно получите какое-либо ускорение при последовательной работе, поскольку это потенциальное узкое место, если драйвер не поддерживает эффективное мультиплексирование. С другой стороны, если вы используете несколько подключений, вам необходимо убедиться, что драйвер будет разумно реализовывать isSameRM, чтобы избежать 2PC, а также разрешить совместное использование блокировок ветвей транзакции (тесная связь), если потокам необходимо видеть незафиксированные изменения друг друга в базе данных. Таким образом, помимо хорошего менеджера транзакций вам понадобится хороший менеджер соединений, например. Реализация JCA и хороший драйвер базы данных. Удачи в их поиске.

person Uncredited    schedule 05.08.2011
comment
Спасибо Uncredited! Я проверил спецификацию JTA. Я нашел слова. и когда я задаю вопрос на форуме BTM, они говорят, что BTM не поддерживает эту функцию. некоторые предлагают Jboss TS или Atomics, ну я не пробовал их. - person Scarlett; 09.08.2011
comment
@scarlet ты нашел решение? Пожалуйста, поделитесь своими выводами. - person kiran.kumar M; 03.11.2011
comment
Я до сих пор понятия не имею, я перехожу на использование только одного потока. а ты? - person Scarlett; 10.11.2011
comment
С форумов BTM: Спецификация JTA явно запрещает транзакции для нескольких потоков. Единственный стандартный способ обойти это - приостановить транзакцию из потока с помощью Transaction.suspend () и возобновить ее в другом потоке с помощью Transaction.resume (). - person Tvaroh; 13.01.2015