Spring 裡JMS和DB的事務整合

來源:互聯網
上載者:User

首先介紹一篇文章:http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=1

不過有點長,我現在都差不都忘了裡面講的內容了。注意評論,裡面提到文章講的內容有些是錯誤的。

Spring裡,如果同時存在JMS操作和DB操作,大概也就三種方式:

1.沒有使用JTA。JMS不在事務中,DB操作在事務中   

     a,訊息處理

     b,開始資料庫事務

     c,資料庫操作

     d,資料庫提交

         成功:結束

         失敗:回到b重試

這種方式事務沒有整合,靠的純粹是我們程式的控制,如果最終資料庫提交都沒成功的話,可以記下log,再人工去糾正資料。例子裡把資料庫操作放在了更重要的位置,其實也可以倒過來,讓資料庫操作先完成,只好在做jms操作,看業務需求了:

     a,開始資料庫事務

     b,資料庫操作

     c,資料庫提交

     d,訊息處理

         成功:結束

         失敗:回到d重試

我們只要把spring配置改成

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
...
<!-- This is important... -->
<property name="sessionTransacted" value="false" />
</bean>
再加上自己程式控制就好了。

2.如果沒有使用JTA,對於上面的配置如果把屬性 sessionTransacted 設成true的話,就產生了第二種方式,過程:

    a,開始jms事務

    b,開始資料庫事務

    c,資料庫和jms操作

    d,提交資料庫操作

    e,提交jms操作

a,b的順序不肯定,不過對程式沒影響,但是d,e的順序是確定的。在Spring裡,資料庫會在spring的commit方法裡提交,而JMS會在afterCommit方法裡提交。如果資料庫失敗,JMS當然也就復原了,但是如果資料庫成功而JMS失敗,就產生了資料不一致,就要加上其它措施。而且這裡還有一個致命缺點,就是某些情況下即使JMS失敗(比如JMS伺服器down了),Spring也不會拋出異常,程式外部以為一切正常,而事實上以產生了不一致問題,而且很難發現。

3.如果使用了JTA那麼把屬性 sessionTransacted 設成true的話,JMS和資料庫操作就在同一個事務裡了,沒什麼好說,最安全的方式,但是效率很低。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.