簡體   English   中英

Spring @Transactional + jdbcTemplate調用Web服務

[英]Spring @Transactional + jdbcTemplate calling a web service

我的應用程序當前正在使用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>

JDBC沒有任何“刷新”概念。 執行SQL查詢時,將執行它們。 沒有要刷新的內容會保留在內存中。

由於事務隔離(默認情況下為READ_COMMITTED),因此您的Web服務不會在數據庫中看到尚未提交的任何內容。 如果這確實是您想要的(在Web服務中),則必須將隔離級別設置為READ_UNCOMMITTED:

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

我們可以在匯編器中從事務中取出callWebservice()方法,然后首先可以從匯編器中調用myMethod,然后是callWebService()方法。 在內部調用Web服務方法中,我們可以處理成功和失敗的情況。 (例如:更新狀態)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM