Недавно мы обновили нашу весеннюю версию до 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 потеряна (прокси или прямой вызов), но это не помогло.