Основными операциями для транзакций являются фиксация и откат, но в распределённой среде с параллельной обработкой может оказаться сложным гарантировать, что операции фиксации или отката будут успешно обработаны, а транзакция может быть распределена между различными потоками, процессорными ядрами, физическими машинами и сетями.
Обеспечение успешного выполнения операции отката в таком сценарии имеет решающее значение. Утилиты параллелизма используют API транзакций Java (JTA) для реализации и поддержки транзакций в своих компонентах через javax.transaction.UserTransaction
, позволяя разработчикам приложений явно управлять границами транзакций. Более подробная информация доступна в спецификации JTA.
Опционально, объекты контекста могут начинать, фиксировать или откатывать транзакции, но эти объекты не могут присоединяться к транзакциям родительских компонентов.
Следующий фрагмент кода иллюстрирует задачу Runnable
, которая получает UserTransaction
, а затем запускает и фиксирует транзакцию при взаимодействии с другими транзакционными компонентами, такими как Enterprise-бин и база данных:
public class MyTransactionalTask implements Runnable {
UserTransaction ut = ... // получение объекта через JNDI или инъецирование
public void run() {
// Старт транзакции
ut.begin();
// Вызов сервиса или EJB
myEJB.businessMethod();
// Обновление базы данных и использованием XA JDBC driver
myEJB.updateCustomer(customer);
// Фиксация транзакции
ut.commit();
}
}