Паралельные транзакции

Рейтинг: 0Ответов: 1Опубликовано: 07.04.2015

Имеется класс чтения и записи файла в БД ReadFileServiceImpl. Чтение файла может длиться несколько часов, поэтому есть необходимость отображения прогресса чтения файла в БД (это метод process класса PercentService). Метод выполняются в отдельной транзакции, чтобы информация о ходе выполнения задачи не была потеряна при её аварийном завершении. Пример:

Класс ReadFileServiceImpl

@Named
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class ReadFileServiceImpl implements ReadFileService {

    @PersistenceContext
    EntityManager em;

    @Resource
    UserTransaction ut;

    @EJB
    PercentService percentService;

    @Override
    public void function() {
        try {
            ut.begin();

            while(...) { // Чтение файла

                em.persist(object) // Пишем объект из файла
                percentService.process(percent); // Пишем прогресс
            }

            ut.commit();
        } finally {
            ut.rollback();
        }
    }
}

Интерфейс PercentService

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public interface PercentService {
    public void percent(Percent p);
}

Можно ли как-нибудь распараллелить эти две транзакции? В реализации выше следующая ошибка:

javax.ejb.EJBException: javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

Ответы

Ответов пока нет.