Spring 4:ThreadPoolTask​​Executor事务管理问题

时间:2014-12-15 08:56:27

标签: spring-transactions threadpoolexecutor spring-4

我们最近将我们的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)但这没有用。

0 个答案:

没有答案