UserTransactionManager - это интерфейс.Ваш контейнер обеспечивает реализацию во время выполнения.
Он использует процесс, называемый двухфазным принятием, когда происходит "мягкое" принятие, а строки удерживаются в подвешенном состоянии, а затем - жесткое принятие.Вот основной обзор:
Контейнер связывается с базой данных, когда вы открываете транзакцию, используя протокол XA, и говорит: «Эй, дайте мне соединение, но на самом деле ничего не пишите до диска (« commit ») доЯ говорю вам об этом. "
Далее вы запускаете некоторые запросы и сбрасываете их в базу данных.Когда вы очищаете свой контейнер, спрашивает базу данных: «Эй, запустите эти запросы, но ничего не пишите, пока я вам не скажу. Если вы не можете гарантировать, что они сразу же выполнят бросок и произойдут ошибка. Если они удастся, заблокируйте строкии таблицы, пока вы не услышите от меня снова, и я дам вам ОК, чтобы подтвердить ".
Наконец, ваша программа закрывает UserTransaction.Затем контейнер говорит базе данных: «Хорошо, все те строки, которые вы заблокировали, сбросьте все на диск (зафиксируйте) и разблокируйте их».
На самом деле все сложнее, особенно когда вы координируете глобальные транзакции.... но в основном, если все участники согласны с тем, что они могут гарантировать фиксацию, то все они фиксируют, или никто не коммитит.*http://en.wikipedia.org/wiki/Two-phase_commit_protocol
http://en.wikipedia.org/wiki/Distributed_transaction