Это не методы XAResource, которые вызывают delistResource, а реализация транзакций сервера приложений. Если вы хотите, чтобы ресурс был удален из списка, получите транзакцию и вызовите ее, он при необходимости вызовет end () для ресурса. Менеджер транзакций также неявно вызывает end () как часть обработки завершения, поэтому вы не делаете это вручную при фиксации или откате. Единственный случай, когда вам нужно обработать список, - это использование одного и того же экземпляра ресурса в нескольких контекстах транзакции. Например
Cache c = getCache();
c.makeUpdate(); // no transaction running, should auto commit.
tx.begin(); // start tx A
c.makeUpdate(); // transactional within A
tx.suspend();
tx.begin(); // start tx B
c.makeUpdate(); // transactional within B
tx.commit(); //end B
tx.resume(A);
tx.commit(); // end A
В зависимости от реализации вашего кэша вам может потребоваться исключить из списка приостановку и снова подключиться при возобновлении, но не для фиксации или отката. В качестве альтернативы вы проверяете контекст транзакции при каждом вызове makeUpdate (), а не полагаетесь на последовательность вызовов enlist / delist, чтобы обновить эффективный контекст tx, хранящийся в экземпляре ресурса.
Эта штука сложная из-за плохого отображения между процедурной спецификацией XA и более или менее объектно-ориентированной спецификацией JTA. Честно говоря, вам, вероятно, лучше оставить это экспертам. Например, JBoss Infinispan предоставляет транзакционный кеш с открытым исходным кодом, который позаботится обо всем этом для вас, а также предлагает множество других функций.