Spring JDBC事务提交失败

时间:2014-08-13 08:57:36

标签: java spring postgresql jdbc

我正在使用事务处理Spring JDBC项目。 我使用PostgreSQL作为数据库:

这是我的弹簧配置:

<tx:annotation-driven/> 
<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    
  <property name="dataSource" ref="dataSourceMainDatabase"/>
</bean>


<bean id="dataSourceMainDatabase" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://localhost/db_toto"/>
    <property name="username" value="toto"/>
    <property name="password" value="toto"/>
    <property name="defaultAutoCommit" value="false" />
    <property name="maxActive" value="5"/>
    <property name="maxIdle" value="5"/>
    <property name="maxWait" value="16000"/>
    <property name="minIdle" value="0"/>
</bean>

在我的java代码中,我有以下内容:

@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly=false)
public void synchronize( Exobox exobox ) {
    daoExotool.updateDerniereSynchro(exobox,new Date(),new Date(),true,10);     
}

DAO代码如下:

public void updateDerniereSynchro(Exobox exobox, Date dateFinSynchro,
        Date dateSynchroDerniereDonnee, boolean synchroOk, int nbPositions) {
    getJdbcTemplate().update(sqlInsertSynchro,exobox.getExoboxId(),dateFinSynchro,
            dateSynchroDerniereDonnee,nbPositions,synchroOk);       
}

使用的查询是这个:

private final String sqlInsertSynchro =     
        "INSERT INTO t_exotool_synchro_log("+
                "synchro_log_exobox_id, synchro_log_date_fin,synchro_log_date_data,"
                + "synchro_log_nb_positions,synchro_log_ok)"+
        "VALUES (?, ?, ?, ? , ?)";

synchronize方法本身是从另一个类调用的,如下所示:

public class DbInserts {
   public static void main(String[] args) {
       ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       exoboxYgos = context.getBean("exoboxYgos",Exobox.class);
       synchro = context.getBean(IServiceSynchro.class);
       context.close(); 
       synchro.synchronize(exoboxYgos);
   }
}

当我启动我的应用程序时,日志显示了这个:

DEBUG [ 13 août 2014 10:52:56 ] Creating new transaction with name [fr.axione.exotool.service.ImplServiceSynchro.synchronize]:   PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; ''
DEBUG [ 13 août 2014 10:52:56 ] Acquired Connection [jdbc:postgresql://localhost/db_exotool, UserName=toto, PostgreSQL Native Driver] for JDBC transaction
DEBUG [ 13 août 2014 10:52:56 ] Executing prepared SQL update
DEBUG [ 13 août 2014 10:52:56 ] Executing prepared SQL statement [INSERT INTO t_exotool_synchro_log(synchro_log_exobox_id, synchro_log_date_fin,synchro_log_date_data,synchro_log_nb_positions,synchro_log_ok)VALUES (?, ?, ?, ? , ?)]
DEBUG [ 13 août 2014 10:52:56 ] Fetching JDBC Connection from DataSource
DEBUG [ 13 août 2014 10:52:56 ] Registering transaction synchronization for JDBC Connection
DEBUG [ 13 août 2014 10:52:56 ] SQL update affected 1 rows
DEBUG [ 13 août 2014 10:52:56 ] Returning JDBC Connection to DataSource
DEBUG [ 13 août 2014 10:52:56 ] Initiating transaction commit
DEBUG [ 13 août 2014 10:52:56 ] Committing JDBC transaction on Connection [jdbc:postgresql://localhost/db_exotool, UserName=toto, PostgreSQL Native Driver]
DEBUG [ 13 août 2014 10:52:56 ] Releasing JDBC Connection [jdbc:postgresql://localhost/db_exotool, UserName=toto, PostgreSQL Native Driver] after transaction
DEBUG [ 13 août 2014 10:52:56 ] Returning JDBC Connection to DataSource

我的问题是插入的行永远不会存储在数据库本身中。

另一方面,如果我设置:

<property name="defaultAutoCommit" value="true" />

插入有效,但回滚无效。

有没有人有想法?

非常感谢, 灵光。

0 个答案:

没有答案