1. Странно, а почему автор не интересуется проблемами с XA у его реализации JMS? Вы ведь хотите объединить в одну транзакцию двух провайдеров: СУБД и JMS. Причем исторически СУБД по части транзакций являются более продвинутыми, это одна из их основных функций, в то время как у сервисов доставки сообщений основной уклон немного в другую сторону. Мне кажется, что возможными проблемами с XA у вашего JMS-провайдера следовало бы озаботиться в первую очередь.
2. Из личного опыта: как-то сталкивался с похожей ситуацией, появилось желание объединить в одну XA-транзакцию JMS (IBM WebSphere MQ) и СУБД (Oracle). Не получилось, лезли какие-то глюки. Это было очень давно, возможно я не разобрался до конца, возможно технологии XA тогда были еще сырые, не важно. Я тогда пошел другим путем. В проекте использовался ORM (Hibernate), соответственно все обращения к СУБД шли через эту прослойку. Так вот, я подумал, что раз и так все делается через Hibernate, то почему бы не посмотреть что там есть по части объединения различных ресурсов в одну транзакцию. И оказалось, что таки есть. У org.hibernate.Transaction есть метод registerSynchronization, который принимает объект, реализующий методы beforeCompletion и afterCompletion. В методе beforeCompletion я и реализовал завершение транзакции JMS. Конечно, такой подход можно считать менее надежным, чем XA-технологии, но абсолютно надежных транзакций не существует. Добавлю лишь, что система высоконагруженная (порядка миллиона транзакций в сутки, из них треть с использованием вышеописанной связки СУБД и JMS, и за 6 лет промышленной эксплуатации вопросов/проблем связанных с именно такой реализацией не было. Так что, на мой взгляд, достойный вариант, не имеющий глюков (по крайней мере в одной системе за 6 лет).