Spring 4: проблема управления транзакциями ThreadPoolTaskExecutor

Недавно мы обновили нашу весеннюю версию до 4.x с 2.x, что начало вызывать некоторые проблемы с одной из наших реализаций «threadpooltaskexecutor».

Реализация была следующей:

public class A
{
..............................
..............................

public void create()
{
    this.threadPoolTaskExecutor.execute(new Runnable()
    {
        public void run()
        {
            createABCAsync();
        }
     });
}


public void createABCAsync()
{
    createABC();
}


public void createABC()
{
    .....................................
    ..................................... 
    abcDAO.saveOrUpdate(abc);
    xyzDAO.saveOrUpdate(xyz);
}

................................................... ...................................................
}

Определения bean-компонентов для класса A содержат записи, подобные приведенным ниже:

`<bean id="clsIntegrationManager" parent="txProxyTemplate"`>
  .................................................
  .................................................
    <property name="transactionAttributes">
        <props>
              <prop key="create">PROPAGATION_REQUIRED</prop>                   
              <prop key="createABCAsync">PROPAGATION_REQUIRES_NEW</prop>
        </props>
    </property>

После весеннего обновления приведенный выше код вызвал исключение, как показано ниже:

Exception in thread "threadPoolTaskExecutor-1" org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

Чтобы устранить вышеизложенное, я добавил следующую запись в файл определения компонента уровня DAO:

<bean id ="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="checkWriteOperations" value="false"/>
</bean>

Приведенная выше запись устранила исключение, но выполнение асинхронного метода, запускающего отдельную транзакцию с использованием REQUIRES_NEW, не выполняет каких-либо фиксаций в базе данных. У нас есть пара вызовов saveOrUpdate() внутри метода createABC(), но ничего не сохраняется в базе данных.

Может кто-нибудь, пожалуйста, помогите понять, что происходит не так выше?

Я попробовал несколько различных подходов к решению, один из которых описан здесь: [Транзакция Spring TaskExecutor потеряна (прокси или прямой вызов), но это не помогло.


person Anand03    schedule 15.12.2014    source источник
comment
createABCASync вызывается из другого внутреннего метода класса createABC, поэтому новая транзакция НЕ будет запущена. Вы уверены, что это работало до весны 2? Странный   -  person Andy Dufresne    schedule 15.12.2014
comment
Привет, Энди, не могли бы вы предложить какой-нибудь способ справиться с описанным выше сценарием? У меня работало с Spring 2.x   -  person Anand03    schedule 15.12.2014
comment
Вам нужно внедрить экземпляр bean-компонента ClassA в тот же класс - Самостоятельная инъекция, а затем вызвать classA.createABCAsync(), чтобы была создана новая транзакция. Включите журналы пакетов транзакций Spring для проверки того, что транзакция действительно запускается.   -  person Andy Dufresne    schedule 15.12.2014
comment
Спасибо за ваш вклад. Не могли бы вы помочь в том, как я могу выполнить самоинъекцию с помощью механизма установки? Моя весенняя конфигурация основана на xml, а не на аннотации   -  person Anand03    schedule 15.12.2014