JavaEE5學習筆記01-JTA和數(shù)據(jù)庫事務_第1頁
JavaEE5學習筆記01-JTA和數(shù)據(jù)庫事務_第2頁
JavaEE5學習筆記01-JTA和數(shù)據(jù)庫事務_第3頁
JavaEE5學習筆記01-JTA和數(shù)據(jù)庫事務_第4頁
JavaEE5學習筆記01-JTA和數(shù)據(jù)庫事務_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

#/7JavaEE5學習筆記01-JTA和數(shù)據(jù)庫事務Email:suhuanzheng7784877@163.com劉巖前言JavaEE5的標準已經(jīng)不是新鮮東西了,現(xiàn)在出了JavaEE6的標準,不過因為應用服務器像Weblogic和Websphere還沒有大力支持呢,所以暫時先放放。JavaEE5是以EJB3.0為核心內(nèi)容所出的標準。主要有:Servlet2.5JSP2.1JSF1.2JSTL1.2JTA1.1JPA2.0EJB3.0JMS1.1JavaMail1.4以上就是JavaEE5提出的相關標準因為JPA在筆者的博客中單獨有總結(jié),在此系列不再做出總結(jié),至于JSF等Web前端技術(shù),之后會做一個文檔形式的總結(jié)的。筆者是以Jboss5作為應用服務器(盡管JBoss6已經(jīng)出了,并且支持JavaEE6標準),JDK版本是1.6.22,開發(fā)IDE為MyEclipse8.6.1。2.JTA簡介JTA(JavaTransactionAPI)提供了事務劃分接口標準,比如同一個數(shù)據(jù)庫的事務,跨數(shù)據(jù)庫訪問業(yè)務的全局事務。在JavaWeb當中可能事務并不是十分重要(相對來說),而在JavaEE企業(yè)級開發(fā),比如涉及到金額的電信、銀行、商務等等對事務比較敏感的系統(tǒng)中,那么事務控制就是一個重點中的重點了。JavaEE通常分為局部事務(LocalTransactionProcessing)和全局事務(DistributedTransactionProcessing)。如果業(yè)務是單一數(shù)據(jù)源就是用局部事務就可以了,如果需要多個數(shù)據(jù)源就需要全局事務來保證對外是透明的、就跟一個數(shù)據(jù)源沒兩樣的策略。簡單的JTA例子比如說我的數(shù)據(jù)庫記錄目前記錄如下于已丄已匚t牢fr[iniji已匸:fw~updst已;IDNAME11卜21liuy=m…Id是主鍵之后我們在JBOSS中配置2個XA類型的數(shù)據(jù)源同時指向這一個數(shù)據(jù)庫。oraclel數(shù)據(jù)源配置內(nèi)容如下<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><datasources><xa-datasource><jndi-name>oraclel</jndi-name><rar-name>jboss-xa-jdbc.rar</rar-name><use-java-context>true</use-java-context><connection-definition>javax.sql.DataSource</connection-definition><jmx-invoker-name>jboss:service=invoker,type=jrmp</jmx-invoker-name><min-pool-size>0</min-pool-size><max-pool-size>10</max-pool-size><blocking-timeout-millis>30000</blocking-timeout-millis><idle-timeout-minutes>30</idle-timeout-minutes><prefill>false</prefill><background-validation>false</background-validation><background-validation-millis〉0</background-validation-millis><validate-on-match>true</validate-on-match><no-tx-separate-pools/><statistics-formatter>org.jboss.resource.statistic.pool.JBossDefaultSubPoolStatisticFormatter</statistics-formatter><isSameRM-override-value>false</isSameRM-override-value><allocation-retry>0</allocation-retry><allocation-retry-wait-millis>5000</allocation-retry-wait-millis><application-managed-securityxsi:type="securityMetaData"xmlns:xsi="/2001/XMLSchema-instance"/><metadata><type-mapping>Oracle9i</type-mapping></metadata><type-mapping>0racle9i</type-mapping>vuser-name>systemv/user-name>vpassword>11111lv/password><exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name><prepared-statement-cache-size>O</prepared-statement-cache-size><share-prepared-statements>false</share-prepared-statements><set-tx-query-timeout>false</set-tx-query-timeout><query-timeout>0</query-timeout><use-try-lock>60000</use-try-lock><xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>vxa-datasource-propertyname="URL">jdbc:oracle:thin:@127?0?0?1:1521:jbossdemooraclev/xa-datasource-property><xa-resource-timeout>0</xa-resource-timeout></xa-datasource></datasources>oracle2內(nèi)容和它差不多,只是jndi-name不同而已。下面是未加事務控制的測試代碼try{Contextctx=newInitialContext();DataSourceds1=(DataSource)ctx.lookup("java:/oracle1");DataSourceds2=(DataSource)ctx.lookup("java:/oracle2");Connectionconnection1=ds1.getConnection();Connectionconnection2=ds2.getConnection();Statementstatement1=connection1.createStatement();Statementstatement2=connection2.createStatement();Stringsql1="insertintojimmy_uservalues(3,'青陽子')";Stringsql2="insertintojimmy_uservalues(2,'非凡公子')";intsun1=statement1.executeUpdate(sql1);intsun2=statement2.executeUpdate(sql2);statement1.close();connection1.close();statement2.close();connection2.close();}catch(NamingExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}執(zhí)行后看到數(shù)據(jù)庫的結(jié)果如下:5已L已ct水壬廠口山jirTiniF_u三已匸f□廠~upda.七已;IDNAME?11表還真-22liu7:iTL33青陽子…青陽子插進去了,非凡公子因為主鍵重復被甩了!下面我們再看加了JTA處理后的代碼如下UserTransactionuserTransaction=null;try{Contextctx=newInitialContext();DataSourceds1=(DataSource)ctx.lookup("java:/oracle1");DataSourceds2=(DataSource)ctx.lookup("java:/oracle2");userTransaction=(UserTransaction)ctx.lookup("UserTransaction");Connectionconnection1=ds1.getConnection();Connectionconnection2=ds2.getConnection();userTransaction.begin();Statementstatement1=connection1.createStatement();Statementstatement2=connection2.createStatement();Stringsql1="insertintojimmy_uservalues(4,'談無欲')";Stringsql2="insertintojimmy_uservalues(3,'傲笑紅塵')";intsunl=statementl.executeUpdate(sql1);intsun2=statement2.executeUpdate(sql2);statement1.close();connection1.close();statement2.close();connection2.close();}catch(NamingExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(NotSupportedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SystemExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();try{userTransaction.rollback();TOC\o"1-5"\h\z}catch(IllegalStateExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}catch(SecurityExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}catch(SystemExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}}執(zhí)行之后,“談無欲”與“傲笑紅塵”都沒進入數(shù)據(jù)庫,全局事務回滾了。4.XA規(guī)范的全局事務中間件XA是分布式事務處理的規(guī)范,具體的實現(xiàn)是不同的數(shù)據(jù)庫廠商自己實現(xiàn)的,mysql驅(qū)動目前不支持XA規(guī)范。通常情況下,交易中間件與數(shù)據(jù)庫通過XA接口規(guī)范,使用兩階段提交來完成一個全局事務,XA規(guī)范的基礎是兩階段提交協(xié)議。在第一階段,交易中間件請求所有相關數(shù)據(jù)庫準備提交(預提交)各自的事務分支,以確認是否所有相關數(shù)據(jù)庫都可以提交各自的事務分支。當某一數(shù)據(jù)庫收到預提交后,如果可以提交屬于自己的事務分支,則將自己在該事務分支中所做的操作固定記錄下來,并給交易中間件一個同意提交的應答,此時數(shù)據(jù)庫將不能再在該事務分支中加入任何操作,但此時數(shù)據(jù)庫并沒有真正提交該事務,數(shù)據(jù)庫對共享資源的操作還未釋放(處于上鎖狀態(tài))。如果由于某種原因數(shù)據(jù)庫無法提交屬于自己的事務分支,它將回滾自己的所有操作,釋放對共享資源上的鎖,并返回給交易中間件失敗應答。在第二階段,交易中間件審查所有數(shù)據(jù)庫返回的預提交結(jié)果,如所有數(shù)據(jù)庫都可以提交,交易中間件將要求所有數(shù)據(jù)庫做正式提交,這樣該全局事務被提交。而如果有任一數(shù)據(jù)庫預提交返回失敗,交易中間件將要求所有其它數(shù)據(jù)庫回滾其操作,這樣該全局事務被回滾。以一個全局事務為例,AP首先通知交易中間件開始一個全局事務,交易中間件通過XA接口函數(shù)通知數(shù)據(jù)庫開始事務,然后AP可以對數(shù)據(jù)庫管理的資源進行操作,數(shù)據(jù)庫系統(tǒng)記錄事務對本地資源的所有操作。操作完成后交易中間件通過XA接口函數(shù)通知數(shù)據(jù)庫操作完成。交易中間件負責記錄AP操作過哪些數(shù)據(jù)庫(事務分支)。AP根據(jù)情況通知交易中間件提交該全局事務,交易中間件會通過XA接口函數(shù)要求各個數(shù)據(jù)庫做預提交,所有數(shù)據(jù)庫返回成功后要求各個數(shù)據(jù)庫做正式提交,此時一筆全局事務結(jié)束。XA規(guī)范對應用來說,最大好處在于事務的完整性由交易中間件和數(shù)據(jù)庫通過XA接口控制,AP只需要關注與數(shù)據(jù)庫的應用邏輯的處理,而無需過多關心事務的完整性,應用設計開發(fā)會簡化很多。具體來說,如果沒有交易中間件,應用系統(tǒng)需要在程序內(nèi)部直接通知數(shù)據(jù)庫開始、結(jié)束和提交事務,當出現(xiàn)異常情況時必須由專門的程序?qū)?shù)據(jù)庫進行反向操作才能完成回滾。如果是有很多事務分支的全局事務,回滾時情況將變得異常復雜。而使用XA接口,則全局事務的提交是由交易中間件控制,應用程序只需通知交易中間件提交或回滾事務,就可以控制整個事務(可能涉及多個異地的數(shù)據(jù)庫)的全部提交或回滾。Jboss就好似這種XA中間件,用戶只要在代碼中顯示的利用JTA接口開啟、提交事務,調(diào)用預先配置好的XA數(shù)據(jù)源就可以了,底層如何做的對用戶是透明的0Jboss為你做了這一切,盡管全局性事務執(zhí)行速度上有些慢??5.事務的傳播與隔離事務具有隔離性,并發(fā)程序發(fā)生的時候,一般有以下5種策略:1.沒有任何隔離限制connection1.setTransactionlsolation(Connection.TRANSACTION_NONE);2?可以讀取未提交事務的數(shù)據(jù),對方已經(jīng)觸發(fā)了相關業(yè)務(取了50塊錢),但是食物還沒提交到數(shù)據(jù)庫中呢,您這邊讀到的數(shù)據(jù)已經(jīng)是少了50塊的數(shù)據(jù)。connection1.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);3?獲取的永遠是提交后的值,這種保證獨到的都是數(shù)據(jù)庫的新值。也值通常采用的策略。connection1.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);4?相對于第三種情況對于單表基本上可以滿足事務需求,但是會導致讀取2次,結(jié)果不相同的事情發(fā)生。單表中可以用下面策略解決connection1.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);5.真正的可串行化的失誤,不過效率最低,資源占用最多。connection1.setTransactionIsola

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論