как разделить одну транзакцию между несколькими потоками - PullRequest
9 голосов
/ 05 августа 2011

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

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

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

1 Ответ

9 голосов
/ 05 августа 2011

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

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

...