我们最近将我们的spring版本从2.x升级到4.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);
}
............................................... ....
.................................................. 。
}
A类的bean定义包含如下条目:
`<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定义文件中添加了如下条目:
<bean id ="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="checkWriteOperations" value="false"/>
</bean>
上面的条目解决了异常,但是使用REQUIRES_NEW启动单独事务的异步方法执行没有进行任何数据库提交。我们在createABC()方法中有几个'saveOrUpdate()'调用,但没有任何东西保存在数据库中。
有人可以帮助理解上面出现的问题吗?
我尝试了一些不同的解决方案,其中一个在这里描述:[Spring TaskExecutor Transaction Lost (Proxy vs. Direct call)但这没有用。