【问题标题】:Spring @Transactional + jdbcTemplate calling a web serviceSpring @Transactional + jdbcTemplate 调用 Web 服务
【发布时间】:2015-01-29 07:24:47
【问题描述】:

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

我有一个在单个事务上调用 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>

【问题讨论】:

    标签: java spring transactions jdbctemplate


    【解决方案1】:

    JDBC 没有任何“刷新”概念。 SQL 查询在您执行时执行。没有要刷新的内容保存在内存中。

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

    @Transactional(isolation = Isolation.READ_UNCOMMITTED)
    

    【讨论】:

    • 如果抛出异常会影响回滚功能吗?
    • 没有。但是您的 Web 服务可能会根据尚未成功提交的信息(通过调用者的事务或任何其他事务)做出决定,这通常是您想要避免的(因为数据甚至可能不处于一致状态,因为它可能会读取另一笔交易的一半结果)
    • 是的,我原以为我会在 Web 服务端遇到问题.....看起来我必须将 Web 服务调用从事务中取出,并手动创建回滚方法.非常感谢!
    【解决方案2】:

    我们可以从汇编器的事务中取出callWebservice()方法,然后可以先从汇编器调用myMethod,然后调用callWebService()方法。 而 insideCall Webservice 方法,我们可以处理成功和失败的场景。 (例如:更新状态)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2014-02-20
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多