我正在使用事务处理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" />
插入有效,但回滚无效。
有没有人有想法?
非常感谢, 灵光。