![](/img/trans.png)
[英]How to insert records from excel to database using spring jdbctemplate
[英]Not able insert records in multiple tables using @Transactional and cn.setAutoCommit(false) with spring jdbcTemplate
我在DAO
类之一中有一个方法,可以在2个不同的Oracle表中插入记录。 我希望将记录插入到表中或都不插入到表中。
为了实现这一点,我同时使用了@Transactional
和cn.setAutoCommit(false)
代码段。
为了对其进行测试,我故意在SQL
中输入了错误的列名,从而导致第二个表中的数据插入失败。 我的期望是,由于查询错误而无法在第二张表中插入数据,因此不会在第一张表中插入数据。 但这由于某种原因没有发生。 记录仍然插入到第一个表中,而第二个表没有插入记录。
看起来这里的实现并不正确。 不知道我在这里想念的是什么。
EventLogDao.java
@Transactional
public long saveEventData(EventLog eventLog, String userId) throws SQLException {
Connection cn = this.dataSource.getConnection();
cn.setAutoCommit(false);
//(FIRST TABLE INSERTION - Table Name: EVENT_LOG)
//save data in event log table
long eventId = getNextEventIdSequence();
saveEventLogData(eventId, eventLog);
//(SECOND TABLE INSERTION - Table Name: EVENT_LOG_MESSAGE)
//save data in event log message table
saveEventLogMessageData(eventId, eventLog.getEventLogMessage());
cn.commit();
return eventId;
}
private void saveEventLogData(long eventId, EventLog eventLog) {
Object[] parameters = {eventId, eventLog.getRouteId(), eventLog.getEventType().getEventTypeId(),
eventLog.getOrderId(), eventLog.getIncomingEventTimestamp(), eventLog.getOutgoingEventTimestamp()};
int[] types = {Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.VARCHAR, Types.TIMESTAMP, Types.TIMESTAMP};
int rowsAffected = jdbcTemplate.update(INSERT_EVENT_LOG_SQL2, parameters, types);
System.out.println("rowsAffected (eventlog) = " + rowsAffected);
}
private int saveEventLogMessageData(long eventId, EventLogMessage eventLogMessage) {
Object[] parameters = {eventId, eventLogMessage.getIncomingEventMessage(), eventLogMessage.getOutgoingEventMessage()};
int[] types = {Types.INTEGER, Types.VARCHAR, Types.VARCHAR};
int rowsAffected = jdbcTemplate.update(INSERT_EVENT_LOG_MESSAGE_SQL2, parameters, types);
System.out.println("rowsAffected (eventLogMessage) = " + rowsAffected);
return rowsAffected;
}
applicationContext.xml中
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<constructor-arg>
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</constructor-arg>
<property name="propagationBehavior">
<util:constant static-field="org.springframework.transaction.support.DefaultTransactionDefinition.PROPAGATION_REQUIRED"/>
</property>
<property name="isolationLevel">
<util:constant static-field="org.springframework.transaction.support.DefaultTransactionDefinition.ISOLATION_READ_COMMITTED"/>
</property>
</bean>
<bean id="eventLogDao" class="com.ebayenterprise.publicapi.events.dao.EventLogDao">
<constructor-arg ref="dataSource" />
</bean>
请指导。
我想您应该将transactionTemplate
与jdbcTemplate
一起使用:
public long saveEventData(EventLog eventLog, String userId) throws SQLException {
return transactionTemplate.execute(new TransactionCallback<Long>(){
@Override
public Long doInTransaction(TransactionStatus transactionStatus) {
try {
Connection cn = this.dataSource.getConnection();
cn.setAutoCommit(false);
//(FIRST TABLE INSERTION - Table Name: EVENT_LOG)
//save data in event log table
long eventId = getNextEventIdSequence();
saveEventLogData(eventId, eventLog);
//(SECOND TABLE INSERTION - Table Name: EVENT_LOG_MESSAGE)
//save data in event log message table
saveEventLogMessageData(eventId, eventLog.getEventLogMessage());
cn.commit();
return eventId;
} catch (Exception e) {
transactionStatus.setRollbackOnly();
}
return 0;
}
});
您可能没有JTA的配置,并且@Transactional
无效。
使用TransactionManager使它正常工作。 下面提到我对代码库所做的更改。
applicationContext.xml(已更新)
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<constructor-arg ref="transactionManager"/>
<property name="propagationBehavior">
<util:constant static-field="org.springframework.transaction.support.DefaultTransactionDefinition.PROPAGATION_REQUIRED"/>
</property>
<property name="isolationLevel">
<util:constant static-field="org.springframework.transaction.support.DefaultTransactionDefinition.ISOLATION_READ_COMMITTED"/>
</property>
</bean>
<bean id="eventLogDao" class="com.ebayenterprise.publicapi.events.dao.EventLogDao">
<constructor-arg index="0" ref="dataSource" />
<constructor-arg index="1" ref="transactionManager"/>
</bean>
EventLogDao.java(已更新)
public EventLogDao(DataSource dataSource, PlatformTransactionManager transactionManager) {
super(dataSource, transactionManager);
}
public long save(EventLog eventLog, String userId) throws Exception {
TransactionDefinition txDef = new DefaultTransactionDefinition();
TransactionStatus txStatus = transactionManager.getTransaction(txDef);
long eventId = 0L;
try {
eventId = getNextEventIdSequence();
System.out.println("eventId = " + eventId);
saveEventLogData(eventId, eventLog);
saveEventLogMessageData(eventId, eventLog.getEventLogMessage());
userId = StringUtils.defaultIfBlank(userId, DEFAULT_USER_ID);
saveEventLogAuditData(eventId, userId, eventLog.getOutgoingEventTimestamp());
transactionManager.commit(txStatus);
} catch (TransactionException ex) {
transactionManager.rollback(txStatus);
throw new RuntimeException("Error occurred during tx management in event log tables...", ex);
} finally {
return eventId;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.