1 Почему вышеуказанный код не запускает полностью независимые транзакции?
Приложение. Сервер управляет транзакцией за вас, которая при необходимости может быть распределенной транзакцией. Зачисляет всех участников автоматически. Когда есть только один участник, вы не замечаете никакой разницы с простой транзакцией JDBC, но если их несколько, распределенная транзакция действительно необходима, поэтому возникает ошибка.
2 Как заставить его запускать независимые транзакции, а не
распределенная транзакция?
Вы можете настроить источник данных на , будь то XA или локальный . Поведение транзакций в Spring / Hibernate также можно настроить на использование обычных транзакций JDBC или делегирование управления транзакциями диспетчеру распределенных транзакций JTA.
Я предлагаю вам переключить источник данных на не-XA и попытаться настроить Spring / Hibernate для использования транзакций JDBC. Вы должны найти соответствующую информацию в документации , здесь, как я подозреваю, есть строка для изменения:
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager" />
По сути, это означает, что вы не используете приложение. Диспетчер распределенных транзакций на сервере.
3 Какая конфигурация может вызвать разницу в поведении между
два сервера приложений?
Если у вас действительно одно и то же приложение и конфигурация, это означает, что в одном случае только один участник зачисляется на дистанцию. транзакции, пока их два во 2-м случае. Один участник обычно соответствует одному физическому соединению с базой данных. Может ли быть так, что в одном случае вы используете две схемы в двух разных базах данных, а во втором - две схемы в физической базе данных ? Более вероятным объяснением будет то, что источник данных был настроен по-разному в двух приложениях. сервер.
PS: если вы используете распределенные транзакции JTA, вы должны использовать UserTransaction.{begin,commit,rollback}
, а не их эквивалент в Session
.