Spring @Transactional + jdbcTemplate调用Web服务

时间:2015-01-29 07:24:47

标签: java spring transactions jdbctemplate

我的应用程序目前正在使用Spring的JdbcTemplate@Transaction注释进行事务处理。

我有一个方法在单个事务上调用 Web服务,我设计它以便Web服务的异常将回滚事务中的所有数据库更改。

我的问题:如何在调用我的Web服务之前刷新数据库更改?

非常感谢

@Autowired
private MyDao dao;

    @Transactional
    @Override
    public void myMethod() {
        .....
        dao.saveThis(myObjectToSaveIsNotAnIssue);

        // I need to FLUSH here in order for my web service to "see" the saved object

       callWebservice();
    }

我的春季配置:

<context:component-scan base-package="com.xxx.xxx" />
    <context:annotation-config />

    <!-- proxy-target-class is set to true to use transactional scope -->
    <tx:annotation-driven proxy-target-class="true" transaction-manager="tomcatTransactionManager" />

    <bean id="sybaseDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/xxx"/>
        <property name="lookupOnStartup" value="true"/>
        <property name="proxyInterface" value="javax.sql.DataSource"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="sybaseDataSource"/>
    </bean>

    <!-- Transaction Manager -->
    <bean id="tomcatTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="sybaseDataSource" />
    </bean>

2 个答案:

答案 0 :(得分:3)

JDBC没有任何“刷新”的概念。执行时会执行SQL查询。没有什么可以被冲洗留在记忆中。

由于事务隔离(默认为READ_COMMITTED),您的Web服务将不会在数据库中看到任何未提交的内容。你必须将隔离级别设置为READ_UNCOMMITTED,如果这真的是你想要的(在Web服务中):

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

答案 1 :(得分:0)

我们可以在汇编器中从事务中取出callWebservice()方法,然后可以首先从汇编器中调用myMethod,然后是callWebService()方法。 在内部调用Web服务方法中,我们可以处理成功和失败的情况。 (例如:更新状态)