Spring事务回滚仅在第一次发生

时间:2014-05-08 02:51:24

标签: java spring transactions quartz-scheduler

这很奇怪,但我可能会遗漏一些东西

我正在使用quartz来初始化spring config xml。当我第一次触发石英作业时,事件会在发生异常时回滚。但是,当再次触发相同的作业时,事务不会因相同的异常而回滚。

我可以从日志中看到,当第一次触发作业时,数据源(来自Websphere数据源的Sybase Jconnect 7的jndi查找)被初始化(而不是第二次)。

服务层

@Transactional(value="transactionManager", propagation=Propagation.REQUIRES_NEW, rollbackFor=Exception.class)
public void saveInfo(
        List<Foo> saveData) throws Exception {

    try{

        myDAO.saveInfo(saveData); //data to rollback on exception. Works First time only :(
    }
    catch(Exception ex){
        logBO.createActivityLog("Error Saving Data");
        throw ex;
    }
}

弹簧-config.xml中

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
         <ref local="sessionFactory"/>
    </property>
</bean>

我已经玩过所有传播设置REQUIRED / REQUIRES_NEW /没有传播。

DAO方法执行批量更新(jdbcTemplate)

修改

第一次记录此行

  

J2CA0086W:可共享连接MCWrapper id 4c384c38已管理   连接WSRdbManagedConnectionImpl @ 6f5a6f5a   状态:使用来自资源mydatasource的STATE_TRAN_WRAPPER_INUSE   在本地交易遏制边界内。

1 个答案:

答案 0 :(得分:0)

试试这个:

@TransactionConfiguration(transactionManager = "txManager",defaultRollback = true)
@Transactional

hibernate和数据源代码:

    <!-- Hibernate Related Configuration. -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://192.168.1.9:5432/dbname"/>
        <property name="username" value="postgres"/>
        <property name="password" value="pwd"/>
        <property name="validationQuery" value="SELECT 1"/>
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.domain"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.generate_statistics">true</prop>
            </props>
        </property>
    </bean>

和txManager:

<!-- Transaction Manager -->
<bean id="txManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="txManager" />
不要忘记添加一行:

<property name="packagesToScan" value="com.domain"/>
<\ n>在sessionfactory中,由于这种情况发生了很多次。