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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

#/7JavaEE5學(xué)習(xí)筆記01-JTA和數(shù)據(jù)庫(kù)事務(wù)Email:suhuanzheng7784877@163.com劉巖前言JavaEE5的標(biāo)準(zhǔn)已經(jīng)不是新鮮東西了,現(xiàn)在出了JavaEE6的標(biāo)準(zhǔn),不過(guò)因?yàn)閼?yīng)用服務(wù)器像Weblogic和Websphere還沒(méi)有大力支持呢,所以暫時(shí)先放放。JavaEE5是以EJB3.0為核心內(nèi)容所出的標(biāo)準(zhǔn)。主要有:Servlet2.5JSP2.1JSF1.2JSTL1.2JTA1.1JPA2.0EJB3.0JMS1.1JavaMail1.4以上就是JavaEE5提出的相關(guān)標(biāo)準(zhǔn)因?yàn)镴PA在筆者的博客中單獨(dú)有總結(jié),在此系列不再做出總結(jié),至于JSF等Web前端技術(shù),之后會(huì)做一個(gè)文檔形式的總結(jié)的。筆者是以Jboss5作為應(yīng)用服務(wù)器(盡管JBoss6已經(jīng)出了,并且支持JavaEE6標(biāo)準(zhǔn)),JDK版本是1.6.22,開(kāi)發(fā)IDE為MyEclipse8.6.1。2.JTA簡(jiǎn)介JTA(JavaTransactionAPI)提供了事務(wù)劃分接口標(biāo)準(zhǔn),比如同一個(gè)數(shù)據(jù)庫(kù)的事務(wù),跨數(shù)據(jù)庫(kù)訪問(wèn)業(yè)務(wù)的全局事務(wù)。在JavaWeb當(dāng)中可能事務(wù)并不是十分重要(相對(duì)來(lái)說(shuō)),而在JavaEE企業(yè)級(jí)開(kāi)發(fā),比如涉及到金額的電信、銀行、商務(wù)等等對(duì)事務(wù)比較敏感的系統(tǒng)中,那么事務(wù)控制就是一個(gè)重點(diǎn)中的重點(diǎn)了。JavaEE通常分為局部事務(wù)(LocalTransactionProcessing)和全局事務(wù)(DistributedTransactionProcessing)。如果業(yè)務(wù)是單一數(shù)據(jù)源就是用局部事務(wù)就可以了,如果需要多個(gè)數(shù)據(jù)源就需要全局事務(wù)來(lái)保證對(duì)外是透明的、就跟一個(gè)數(shù)據(jù)源沒(méi)兩樣的策略。簡(jiǎn)單的JTA例子比如說(shuō)我的數(shù)據(jù)庫(kù)記錄目前記錄如下于已丄已匚t牢fr[iniji已匸:fw~updst已;IDNAME11卜21liuy=m…Id是主鍵之后我們?cè)贘BOSS中配置2個(gè)XA類型的數(shù)據(jù)源同時(shí)指向這一個(gè)數(shù)據(jù)庫(kù)。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不同而已。下面是未加事務(wù)控制的測(cè)試代碼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,'青陽(yáng)子')";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ù)庫(kù)的結(jié)果如下:5已L已ct水壬廠口山j(luò)irTiniF_u三已匸f□廠~upda.七已;IDNAME?11表還真-22liu7:iTL33青陽(yáng)子…青陽(yáng)子插進(jìn)去了,非凡公子因?yàn)橹麈I重復(fù)被甩了!下面我們?cè)倏醇恿薐TA處理后的代碼如下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,'談無(wú)欲')";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í)行之后,“談無(wú)欲”與“傲笑紅塵”都沒(méi)進(jìn)入數(shù)據(jù)庫(kù),全局事務(wù)回滾了。4.XA規(guī)范的全局事務(wù)中間件XA是分布式事務(wù)處理的規(guī)范,具體的實(shí)現(xiàn)是不同的數(shù)據(jù)庫(kù)廠商自己實(shí)現(xiàn)的,mysql驅(qū)動(dòng)目前不支持XA規(guī)范。通常情況下,交易中間件與數(shù)據(jù)庫(kù)通過(guò)XA接口規(guī)范,使用兩階段提交來(lái)完成一個(gè)全局事務(wù),XA規(guī)范的基礎(chǔ)是兩階段提交協(xié)議。在第一階段,交易中間件請(qǐng)求所有相關(guān)數(shù)據(jù)庫(kù)準(zhǔn)備提交(預(yù)提交)各自的事務(wù)分支,以確認(rèn)是否所有相關(guān)數(shù)據(jù)庫(kù)都可以提交各自的事務(wù)分支。當(dāng)某一數(shù)據(jù)庫(kù)收到預(yù)提交后,如果可以提交屬于自己的事務(wù)分支,則將自己在該事務(wù)分支中所做的操作固定記錄下來(lái),并給交易中間件一個(gè)同意提交的應(yīng)答,此時(shí)數(shù)據(jù)庫(kù)將不能再在該事務(wù)分支中加入任何操作,但此時(shí)數(shù)據(jù)庫(kù)并沒(méi)有真正提交該事務(wù),數(shù)據(jù)庫(kù)對(duì)共享資源的操作還未釋放(處于上鎖狀態(tài))。如果由于某種原因數(shù)據(jù)庫(kù)無(wú)法提交屬于自己的事務(wù)分支,它將回滾自己的所有操作,釋放對(duì)共享資源上的鎖,并返回給交易中間件失敗應(yīng)答。在第二階段,交易中間件審查所有數(shù)據(jù)庫(kù)返回的預(yù)提交結(jié)果,如所有數(shù)據(jù)庫(kù)都可以提交,交易中間件將要求所有數(shù)據(jù)庫(kù)做正式提交,這樣該全局事務(wù)被提交。而如果有任一數(shù)據(jù)庫(kù)預(yù)提交返回失敗,交易中間件將要求所有其它數(shù)據(jù)庫(kù)回滾其操作,這樣該全局事務(wù)被回滾。以一個(gè)全局事務(wù)為例,AP首先通知交易中間件開(kāi)始一個(gè)全局事務(wù),交易中間件通過(guò)XA接口函數(shù)通知數(shù)據(jù)庫(kù)開(kāi)始事務(wù),然后AP可以對(duì)數(shù)據(jù)庫(kù)管理的資源進(jìn)行操作,數(shù)據(jù)庫(kù)系統(tǒng)記錄事務(wù)對(duì)本地資源的所有操作。操作完成后交易中間件通過(guò)XA接口函數(shù)通知數(shù)據(jù)庫(kù)操作完成。交易中間件負(fù)責(zé)記錄AP操作過(guò)哪些數(shù)據(jù)庫(kù)(事務(wù)分支)。AP根據(jù)情況通知交易中間件提交該全局事務(wù),交易中間件會(huì)通過(guò)XA接口函數(shù)要求各個(gè)數(shù)據(jù)庫(kù)做預(yù)提交,所有數(shù)據(jù)庫(kù)返回成功后要求各個(gè)數(shù)據(jù)庫(kù)做正式提交,此時(shí)一筆全局事務(wù)結(jié)束。XA規(guī)范對(duì)應(yīng)用來(lái)說(shuō),最大好處在于事務(wù)的完整性由交易中間件和數(shù)據(jù)庫(kù)通過(guò)XA接口控制,AP只需要關(guān)注與數(shù)據(jù)庫(kù)的應(yīng)用邏輯的處理,而無(wú)需過(guò)多關(guān)心事務(wù)的完整性,應(yīng)用設(shè)計(jì)開(kāi)發(fā)會(huì)簡(jiǎn)化很多。具體來(lái)說(shuō),如果沒(méi)有交易中間件,應(yīng)用系統(tǒng)需要在程序內(nèi)部直接通知數(shù)據(jù)庫(kù)開(kāi)始、結(jié)束和提交事務(wù),當(dāng)出現(xiàn)異常情況時(shí)必須由專門(mén)的程序?qū)?shù)據(jù)庫(kù)進(jìn)行反向操作才能完成回滾。如果是有很多事務(wù)分支的全局事務(wù),回滾時(shí)情況將變得異常復(fù)雜。而使用XA接口,則全局事務(wù)的提交是由交易中間件控制,應(yīng)用程序只需通知交易中間件提交或回滾事務(wù),就可以控制整個(gè)事務(wù)(可能涉及多個(gè)異地的數(shù)據(jù)庫(kù))的全部提交或回滾。Jboss就好似這種XA中間件,用戶只要在代碼中顯示的利用JTA接口開(kāi)啟、提交事務(wù),調(diào)用預(yù)先配置好的XA數(shù)據(jù)源就可以了,底層如何做的對(duì)用戶是透明的0Jboss為你做了這一切,盡管全局性事務(wù)執(zhí)行速度上有些慢??5.事務(wù)的傳播與隔離事務(wù)具有隔離性,并發(fā)程序發(fā)生的時(shí)候,一般有以下5種策略:1.沒(méi)有任何隔離限制connection1.setTransactionlsolation(Connection.TRANSACTION_NONE);2?可以讀取未提交事務(wù)的數(shù)據(jù),對(duì)方已經(jīng)觸發(fā)了相關(guān)業(yè)務(wù)(取了50塊錢(qián)),但是食物還沒(méi)提交到數(shù)據(jù)庫(kù)中呢,您這邊讀到的數(shù)據(jù)已經(jīng)是少了50塊的數(shù)據(jù)。connection1.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);3?獲取的永遠(yuǎn)是提交后的值,這種保證獨(dú)到的都是數(shù)據(jù)庫(kù)的新值。也值通常采用的策略。connection1.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);4?相對(duì)于第三種情況對(duì)于單表基本上可以滿足事務(wù)需求,但是會(huì)導(dǎo)致讀取2次,結(jié)果不相同的事情發(fā)生。單表中可以用下面策略解決connection1.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);5.真正的可串行化的失誤,不過(guò)效率最低,資源占用最多。connection1.setTransactionIsola

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論