J2EE項(xiàng)目實(shí)訓(xùn)Spring框架技術(shù)第9章Spring中的事務(wù)管理技術(shù)及實(shí)現(xiàn)第2部分_第1頁
J2EE項(xiàng)目實(shí)訓(xùn)Spring框架技術(shù)第9章Spring中的事務(wù)管理技術(shù)及實(shí)現(xiàn)第2部分_第2頁
J2EE項(xiàng)目實(shí)訓(xùn)Spring框架技術(shù)第9章Spring中的事務(wù)管理技術(shù)及實(shí)現(xiàn)第2部分_第3頁
J2EE項(xiàng)目實(shí)訓(xùn)Spring框架技術(shù)第9章Spring中的事務(wù)管理技術(shù)及實(shí)現(xiàn)第2部分_第4頁
J2EE項(xiàng)目實(shí)訓(xùn)Spring框架技術(shù)第9章Spring中的事務(wù)管理技術(shù)及實(shí)現(xiàn)第2部分_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、楊教授工作室 精心創(chuàng)作的優(yōu)秀程序員 職業(yè)提升必讀系列資料第9章 spring中的事務(wù)管理技術(shù)及實(shí)現(xiàn)(第2/3部分)1.1.1 spring框架中與事務(wù)管理相關(guān)的api1、org.springframework.transaction.platformtransactionmanager接口(1)platformtransactionmanager接口的定義【例9-6】platformtransactionmanager接口定義的代碼示例package org.springframework.transaction ;public interface platformtransactionman

2、ager void commit(transactionstatus status); transactionstatus gettransaction(transactiondefinition definition); void rollback(transactionstatus status); 在該接口中,定義了對事務(wù)管理和控制的主要的方法,如commit 和rollback等。開發(fā)者借助于該接口的實(shí)現(xiàn)類來達(dá)到對應(yīng)用系統(tǒng)中的數(shù)據(jù)訪問組件進(jìn)行事務(wù)管理和控制。所有spring的事務(wù)分離功能都會(huì)委托給platformtransactionmanager(但實(shí)際是傳給相應(yīng)的transacti

3、ondefinition類的對象實(shí)例)來做實(shí)際的事務(wù)執(zhí)行。(2)platformtransactionmanager接口的各個(gè)實(shí)現(xiàn)類通過查看spring框架所提供的api幫助文檔,可以了解到platformtransactionmanager接口有下面的幾種不同形式的實(shí)現(xiàn)類。之所以提供這么多的不同的實(shí)現(xiàn)類,其目的無非還是能夠真正實(shí)現(xiàn)應(yīng)用系統(tǒng)與底層的事務(wù)資源的無關(guān)性,從而也達(dá)到實(shí)現(xiàn)前面所介紹的spring事務(wù)管理的底層實(shí)現(xiàn)是采用對事務(wù)資源的抽象設(shè)計(jì)方案的目標(biāo)。1) datasourcetransactionmanager(針對標(biāo)準(zhǔn)的jdbc技術(shù))2) jtatransactionmanager(

4、針對jta技術(shù))3) hibernatetransactionmanager(針對hibernate o/r mapping技術(shù))4) jdotransactionmanager(針對jdo技術(shù))5) persistencebrokertransactionmanager(針對ojb技術(shù))6) jmstransactionmanager(針對j2ee jms技術(shù))注意:無論是單個(gè)還是多個(gè)事務(wù)資源管理器,都可以使用jtatransactionmanager類。但如果使用jtatransactionmanager,那么所有事務(wù)管理實(shí)際都會(huì)委托給底層應(yīng)用服務(wù)器的jta來實(shí)現(xiàn)。(3)platformt

5、ransactionmanager接口的各個(gè)實(shí)現(xiàn)類是對相應(yīng)的事務(wù)資源的包裝為了能夠讓讀者真正理解spring框架在事務(wù)方面是如何達(dá)到讓應(yīng)用系統(tǒng)與底層的事務(wù)資源的無關(guān)性的目標(biāo),通過查看和閱讀spring框架中所攜帶的源代碼,可以發(fā)現(xiàn)這些xxxxmanager類在具體事務(wù)的技術(shù)實(shí)現(xiàn)方面,其實(shí)就是簡單地調(diào)用相應(yīng)的事務(wù)資源中所提供的事務(wù)管理和控制的操作方法。讀者從下面【例9-7】中所示的hibernatetransactionmanager 的代碼示例中,很明顯地能夠了解到上面所描述的特性,并請注意其中的黑體部分的代碼。 【例9-7】 hibernatetransactionmanager類的部分代碼

6、示例package org.springframework.orm.hibernate3;/ import 語句,在此加以省略public class hibernatetransactionmanager extends abstractplatformtransactionmanagerimplements beanfactoryaware, initializingbean protected void docommit(defaulttransactionstatus status) hibernatetransactionobject txobject = (hibernatetra

7、nsactionobject) status.gettransaction();/。 其它的語句代碼,在此加以省略trytxobject.getsessionholder().gettransaction().commit();/。 其它的語句代碼,在此加以省略protected void dorollback(defaulttransactionstatus status)hibernatetransactionobject txobject = (hibernatetransactionobject) status.gettransaction();/。 其它的語句代碼,在此加以省略try

8、txobject.getsessionholder().gettransaction().rollback();/。 其它的語句代碼,在此加以省略protected void dosetrollbackonly(defaulttransactionstatus status) hibernatetransactionobject txobject = (hibernatetransactionobject) status.gettransaction();/。 其它的語句代碼,在此加以省略txobject.setrollbackonly();/。 其它的方法的定義代碼,在此加以省略比如下面的【

9、例9-8】中所示的datasourcetransactionmanager的代碼示例也更進(jìn)一步地驗(yàn)證了該實(shí)現(xiàn)方式,同樣也請注意其中的黑體部分的代碼。 【例9-8】 datasourcetransactionmanager類的部分代碼示例package org.springframework.jdbc.datasource;/ import 語句,在此加以省略public class datasourcetransactionmanager extends abstractplatformtransactionmanager implements initializingbean protect

10、ed void docommit(defaulttransactionstatus status) datasourcetransactionobject txobject = (datasourcetransactionobject) status.gettransaction();connection con = txobject.getconnectionholder().getconnection();/。 其它的語句代碼,在此加以省略trymit();/。 其它的語句代碼,在此加以省略protected void dorollback(defaulttransactionstatus

11、 status) datasourcetransactionobject txobject = (datasourcetransactionobject) status.gettransaction();connection con = txobject.getconnectionholder().getconnection();/。 其它的語句代碼,在此加以省略trycon.rollback();/。 其它的語句代碼,在此加以省略protected void dosetrollbackonly(defaulttransactionstatus status)datasourcetransac

12、tionobject txobject = (datasourcetransactionobject) status.gettransaction();/。 其它的語句代碼,在此加以省略txobject.setrollbackonly();(4)platformtransactionmanager接口的主要作用在spring框架中提供該接口的主要目的是實(shí)現(xiàn)分離應(yīng)用系統(tǒng)中的事務(wù)管理的具體技術(shù)實(shí)現(xiàn)不會(huì)被限定于某個(gè)特定的事務(wù)管理實(shí)現(xiàn)的環(huán)境和平臺(其實(shí)是應(yīng)用了依賴倒置原則dip,dependency inversion principle,請見下面的圖9.1中的原理示圖)。這樣,開發(fā)者可以根據(jù)應(yīng)用系統(tǒng)

13、本身的實(shí)際運(yùn)行的環(huán)境而合理地選擇platformtransactionmanager接口的不同實(shí)現(xiàn)類,并且還可以很容易地切換事務(wù)實(shí)現(xiàn)的策略。圖9.1 依賴倒置原則dip的原理示圖2、platformtransactionmanager接口的各個(gè)實(shí)現(xiàn)類的具體應(yīng)用通過采用spring框架中對事務(wù)的支持,應(yīng)用系統(tǒng)的開發(fā)者在開發(fā)過程中和系統(tǒng)的實(shí)際運(yùn)行環(huán)境中所采用的環(huán)境可以并一致,從而簡化開發(fā)過程和提高開發(fā)的效率。當(dāng)應(yīng)用系統(tǒng)開發(fā)完成后,只需要改變spring的ioc的xml外部配置文件來進(jìn)行運(yùn)行環(huán)境的切換。(1)如果使用jdbc或ibatis作為系統(tǒng)的事務(wù)資源管理器此時(shí)開發(fā)者可以使用簡單的datasou

14、rcetransactionmanager事務(wù)資源管理器實(shí)現(xiàn)類,其配置標(biāo)簽的示例請見下面的【例9-9】所示,需要為其提供datasource對象。【例9-9】datasourcetransactionmanager事務(wù)資源管理器實(shí)現(xiàn)類的應(yīng)用示例<bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"><property name="datasource"><r

15、ef bean="datasource" /></property></bean> (2)如果使用hibernate框架作為系統(tǒng)的事務(wù)資源管理器此時(shí)開發(fā)者可以使用hibernatetransactionmanager事務(wù)資源管理器實(shí)現(xiàn)類,其配置標(biāo)簽的示例請見下面的【例9-10】中所示的內(nèi)容,需要為其提供sessionfactory對象的實(shí)例?!纠?-10】hibernatetransactionmanager事務(wù)資源管理器實(shí)現(xiàn)類的應(yīng)用示例<bean id="transactionmanager" class="

16、;org.springframework.orm.hibernate. hibernatetransactionmanager"><property name="sessionfactory"><ref bean ="sessionfactory"/></property></bean> (3)如果使用websphere應(yīng)用服務(wù)器的jta支持此時(shí)開發(fā)者只需要把上述對應(yīng)bean定義中的class屬性改成為下面的org.springframework.transaction.jta.jtatra

17、nsactionmanager,然后再把屬性改為websphere對應(yīng)的transactionmanager實(shí)現(xiàn)類,其配置標(biāo)簽的示例請見下面的【例9-11】所示,需要為其transactionmanager屬性提供webspheretransactionmanagerfactorybean對象實(shí)例?!纠?-11】 jtatransactionmanager分布式事務(wù)資源管理器實(shí)現(xiàn)類的應(yīng)用示例<bean id="webspherejtatransactionmanager" class="org.springframework.transaction.jta.

18、webspheretransactionmanagerfactorybean"/><bean id="transactionmanager" class="org.springframework.transaction.jta.jtatransactionmanager"><property name="transactionmanager"><ref bean ="webspherejtatransactionmanager"/></property>

19、;</bean>1.2 在spring中實(shí)現(xiàn)編程式的事務(wù)管理1.2.1 spring中提供的對編程式的事務(wù)管理的支持1、傳統(tǒng)的jdbc事務(wù)管理中編程式的事務(wù)管理實(shí)現(xiàn)(1)對每個(gè)請求都是從數(shù)據(jù)源中重新取出一個(gè)連接以往使用jdbc進(jìn)行數(shù)據(jù)操作時(shí),一般采用datasource接口并通過實(shí)現(xiàn)了datasource接口的數(shù)據(jù)庫連接池實(shí)現(xiàn)對物理數(shù)據(jù)庫的最終的連接(獲得從數(shù)據(jù)源中得到的connection對象實(shí)例)。而數(shù)據(jù)源datasource是線程安全的,但數(shù)據(jù)庫的數(shù)據(jù)連接對象connection實(shí)例不是線程安全的,因此必須對每個(gè)數(shù)據(jù)訪問的請求都需要重新從數(shù)據(jù)源中獲得一個(gè)數(shù)據(jù)庫的連接對象實(shí)例。

20、當(dāng)然,由于jdbc中的datasource為接口,一般的datasource接口的數(shù)據(jù)源具體實(shí)現(xiàn)可以是由j2ee應(yīng)用服務(wù)器容器來提供實(shí)現(xiàn)和數(shù)據(jù)庫連接以及包括連接池等方面的管理。例如tomcat、websphere 和weblogic等j2ee應(yīng)用服務(wù)器容器中都提供了對datasource接口的具體實(shí)現(xiàn)。但由于j2ee應(yīng)用服務(wù)器容器所提供的datasource接口的數(shù)據(jù)源具體實(shí)現(xiàn),要求開發(fā)者通過jndi來獲得其具體的數(shù)據(jù)庫連接connection對象實(shí)例,這樣將使得應(yīng)用系統(tǒng)的持久層中的dao組件將緊密地依賴某種j2ee應(yīng)用服務(wù)器容器。因此,開發(fā)者也可以應(yīng)用類似apache的dbcp這樣中立的da

21、tasource接口的數(shù)據(jù)源具體實(shí)現(xiàn)。(2)jdbc標(biāo)準(zhǔn)的事務(wù)管理實(shí)現(xiàn)的代碼為了對比jdbc和spring框架兩者在事務(wù)管理實(shí)現(xiàn)的代碼方面的差別,下面在【例9-12】中給出一個(gè)基于jdbc標(biāo)準(zhǔn)的事務(wù)管理實(shí)現(xiàn)的模板代碼示例。【例9-12】基于jdbc標(biāo)準(zhǔn)的事務(wù)管理實(shí)現(xiàn)的模板代碼示例connection conn = null;tryconn = dbconnectionfactory.getconnection;conn.setautocommit(false); /(1) 缺省方式是自動(dòng)提交/完成對數(shù)據(jù)庫的修改操作,在此沒有列出細(xì)節(jié)代碼mit(); /(2)自己提交(確認(rèn)數(shù)據(jù)修改的行為)cat

22、ch(exception e)conn.rollback(); /(3) 恢復(fù)修改(回滾)/進(jìn)行異常處理finallytryconn.close();/(4) 關(guān)閉數(shù)據(jù)庫連接catch(sqlexception se) /進(jìn)行異常處理 (3)jdbc標(biāo)準(zhǔn)的事務(wù)管理實(shí)現(xiàn)代碼的主要缺點(diǎn)從上面的jdbc標(biāo)準(zhǔn)的事務(wù)管理實(shí)現(xiàn)代碼中可以了解到,不僅所編程實(shí)現(xiàn)的代碼量比較長,而且也很容易疏忽或者忘掉一些異常捕獲等的try/catch語句。而且還必須在進(jìn)行數(shù)據(jù)訪問之前將jdbc的自動(dòng)提交模式改變?yōu)槭謩?dòng)提交模式(conn.setautocommit(false);的功能)。2、spring 框架dao組件中的j

23、dbctemplate類的缺省的事務(wù)管理模式(1)spring框架對jdbc事務(wù)管理方式進(jìn)行了進(jìn)一步的包裝對此讀者通過前面的【例9-8】中的datasourcetransactionmanager類的部分代碼示例中應(yīng)該能夠理解,這樣將能夠在一定的程度上簡化標(biāo)準(zhǔn)的jdbc的編程實(shí)現(xiàn)。因?yàn)椋趕pring框架中還提供了幾個(gè)與編程實(shí)現(xiàn)的事務(wù)處理技術(shù)相關(guān)的一些幫助類。 1) transactiondefinition,實(shí)現(xiàn)對事務(wù)的屬性進(jìn)行定義2) transcationstatus,它代表了當(dāng)前的事務(wù)運(yùn)行的狀態(tài),輔助事務(wù)提交和回滾等操作3) platformtransactionmanager接口,它

24、具體實(shí)現(xiàn)對事務(wù)的管理和控制行為 這些幫助類是spring框架提供的用于管理事務(wù)的基礎(chǔ)api,由于platformtransactionmanager為接口,因此對該接口提供如下的一個(gè)實(shí)現(xiàn)的抽象類abstractplatformtransactionmanager,并且在該類的基礎(chǔ)上又針對不同的事務(wù)資源提供了具體的實(shí)現(xiàn)類,比如在下面所要使用的事務(wù)管理類datasourcetransactionmanager等都是這個(gè)abstractplatformtransactionmanager類的子類。(2)jdbctemplate類的缺省的事務(wù)管理模式同樣也采用jdbc默認(rèn)的autocommit模式由于

25、在spring 框架的dao組件中的jdbctemplate類中的各種數(shù)據(jù)訪問操作方法采用的是jdbc默認(rèn)的自動(dòng)提交(autocommit)模式,因此如果在實(shí)現(xiàn)某個(gè)轉(zhuǎn)帳系統(tǒng)中采用下面的示例中的代碼,將同樣也無法保證數(shù)據(jù)操作的原子性。【例9-13】本示例中的代碼將也無法保證數(shù)據(jù)操作的原子性jdbctemplate jdbctemplate = new jdbctemplate(datasource);jdbctemplate.update("update incomecount set money=money-100 where id = '1234'");j

26、dbctemplate.update("update outcomecount set money=money-100 where id = '1234'");其主要的錯(cuò)誤原因是由于在spring框架的dao組件中的jdbctemplate類采用了autocommit模式,因此當(dāng)?shù)谝粭lupdate的數(shù)據(jù)操作完成之后將被自動(dòng)提交,此時(shí)的數(shù)據(jù)庫表中用戶id號為“1234”的對應(yīng)的記錄中的數(shù)據(jù)已經(jīng)被更新,如果第二條sql語句的操作出現(xiàn)了失敗,系統(tǒng)將無法使得整個(gè)事務(wù)回滾到最初的狀態(tài)。(3)利用datasourcetransactionmanager類實(shí)現(xiàn)代碼控制的事

27、務(wù)管理org.springframework.jdbc.datasource.datasourcetransactionmanager類為jdbc datasource類型的數(shù)據(jù)源的事務(wù)管理組件。對于該組件的應(yīng)用,開發(fā)者只需要在spring 框架ioc容器的xml配置的bean的定義配置文件中對它進(jìn)行簡單的配置,然后將其通過屬性依賴注入引入到應(yīng)用系統(tǒng)的dao組件類中。3、使用spring 框架編程式的事務(wù)管理的基本流程(1)首先聲明一個(gè)基于datasource接口的數(shù)據(jù)源的實(shí)現(xiàn)類的對象實(shí)例(2)其次聲明一個(gè)事務(wù)管理類,可以在下面的幾種形式中根據(jù)應(yīng)用系統(tǒng)的實(shí)際數(shù)據(jù)訪問平臺來合理地選擇其一,例如d

28、atasourcetransactionmanager、hibernatetransactionmanger和jtatransactionmanager等事務(wù)管理的具體實(shí)現(xiàn)類。(3)最后在應(yīng)用系統(tǒng)的有關(guān)的組件代碼中加入事務(wù)處理控制的相關(guān)的代碼4、使用spring 框架編程式的事務(wù)管理的代碼示例在下面的【例9-14】中的spring 框架編程式的事務(wù)管理的代碼示例中,其編程的代碼基本上是按照前面所描述的流程來實(shí)現(xiàn)的。其中的datasource對象實(shí)例是通過依賴注入而獲得的。當(dāng)然,開發(fā)者也可以直接將jdbctemplate類的對象實(shí)例以屬性注入的方式依賴注入進(jìn)來)【例9-14】spring 編程式

29、的事務(wù)管理的代碼示例transactiondefinition td = new transactiondefinition();transactionstatus status = transactionmanager.gettransaction(td);tryjdbctemplate jdbctemplate = new jdbctemplate(datasource);jdbctemplate.update("update incomecount set money=money-100 where id = '1234'");jdbctemplate

30、.update("update outcomecount set money=money-100 where id = '1234'");transactionmmit(status);catch(exception e)transactionmanager.rollback(status);1.2.2 在spring框架中實(shí)現(xiàn)編程式的事務(wù)管理的實(shí)例下面通過某個(gè)項(xiàng)目中的持久層中的dao組件中的某個(gè)數(shù)據(jù)訪問方法中應(yīng)用事務(wù)和不應(yīng)用事務(wù)所出現(xiàn)的各種結(jié)果,讓讀者體驗(yàn)事務(wù)中的“原子性”、“一致性”和spring框架中的編程式的事務(wù)管理的具體實(shí)現(xiàn)步驟。1、對dao組件中

31、的某個(gè)數(shù)據(jù)訪問方法不應(yīng)用事務(wù)控制技術(shù)在下面的dao組件中的updateoneuserinfo方法中實(shí)現(xiàn)對用戶的信息進(jìn)行修改,但為了能夠應(yīng)用事務(wù)控制技術(shù),故意執(zhí)行兩次修改并且第二次的修改中的update的sql語句中的數(shù)據(jù)庫表名稱寫錯(cuò)誤,這樣將導(dǎo)致第二次的修改操作是無法成功的。然后再觀察對比應(yīng)用事務(wù)和不應(yīng)用事務(wù)所出現(xiàn)的各種不同的結(jié)果,請注意其中的黑體部分的代碼?!纠?-14】對updateoneuserinfo數(shù)據(jù)訪問方法不應(yīng)用事務(wù)控制技術(shù)的代碼示例public boolean updateoneuserinfo(userinfovo oneuserinfovo,string newuserpa

32、ssword)string username=oneuserinfovo.getusername(); string userpassword=oneuserinfovo.getuserpassword(); object parameter=newuserpassword,username,userpassword; string updatesql1 = "update userinfo set userpassword = ? where username =? and userpassword=?" string updatesql2 = "update

33、userinfo2 set userpassword = ? where username =? and userpassword=?" this.jdbctemplate.update(updatesql1,parameter); this.jdbctemplate.update(updatesql2,parameter);return true;然后啟動(dòng)對用戶信息進(jìn)行修改的表示層的頁面,并輸入新的用戶信息。請見下面的圖9.2中所示的狀態(tài)。圖9.2 啟動(dòng)對用戶信息進(jìn)行修改的表示層的頁面當(dāng)在頁面中進(jìn)行提交后,將出現(xiàn)下面的圖9.3中所示的錯(cuò)誤提示結(jié)果。圖9.3 執(zhí)行后所產(chǎn)生的錯(cuò)誤提示結(jié)

34、果其錯(cuò)誤的主要原因是第二條sql語句中的數(shù)據(jù)庫表名稱是不存在的,因此在數(shù)據(jù)訪問中將產(chǎn)生出錯(cuò)誤,這從所顯示的錯(cuò)誤提示信息頁能夠反映出該狀態(tài)。但由于在updateoneuserinfo中的第一次的數(shù)據(jù)修改是成功的,因此用戶的密碼仍然會(huì)被修改。因?yàn)?,此時(shí)沒有應(yīng)用事務(wù)控制,當(dāng)然對數(shù)據(jù)訪問的“一致性”將無法達(dá)到保證。執(zhí)行后,再打開具體的數(shù)據(jù)庫表,發(fā)現(xiàn)用戶的密碼信息仍然被修改!請見下面的圖9.4中的所示的結(jié)果(原來的用戶的密碼1234被改變?yōu)?5678)。圖9.4 打開數(shù)據(jù)庫表后發(fā)現(xiàn)用戶的密碼信息仍然被修改2、對dao組件中的該數(shù)據(jù)訪問方法應(yīng)用事務(wù)控制技術(shù)(1)在dao類daoimple中添加一個(gè)plat

35、formtransactionmanager 類型的transactionmanager屬性,并且提供set方法【例9-15】 添加transactionmanager屬性和提供set方法private platformtransactionmanager transactionmanager;public void settransactionmanager(platformtransactionmanager transactionmanager) this.transactionmanager = transactionmanager;下面的圖9.5為開發(fā)過程中的程序代碼的顯示情況。圖9

36、.5 在dao組件中添加transactionmanager屬性和提供set方法(2)修改dao組件中的updateoneuserinfo方法以應(yīng)用事務(wù)技術(shù)【例9-16】在dao組件updateoneuserinfo方法中應(yīng)用事務(wù)控制技術(shù)的代碼示例public boolean updateoneuserinfo(userinfovo oneuserinfovo,string newuserpassword)string username=oneuserinfovo.getusername(); string userpassword=oneuserinfovo.getuserpassword(

37、); object parameter=newuserpassword,username,userpassword; string updatesql1 = "update userinfo set userpassword = ? where username =? and userpassword=?" string updatesql2 = "update abctable set userpassword = ? where username =? and userpassword=?" defaulttransactiondefinition

38、def = new defaulttransactiondefinition(); transactionstatus status = transactionmanager.gettransaction(def); try this.jdbctemplate.update(updatesql1,parameter); this.jdbctemplate.update(updatesql2,parameter); catch (dataaccessexception ex) / 也可以執(zhí)行status.setrollbackonly(); transactionmanager.rollback

39、(status); throw ex; transactionmmit(status);return true;請注意其中的黑體部分的示例代碼,為了能夠觀察應(yīng)用了事務(wù)處理技術(shù)后的效果,在代碼中仍然對數(shù)據(jù)庫表進(jìn)行了兩次修改,其中第二次修改應(yīng)該是失敗的(因?yàn)楣室庠跀?shù)據(jù)庫表名稱上寫錯(cuò),這使得sql語句不合語法,因而造成dataaccessexception(它封裝了sqlexception)的異常拋出,這個(gè)異常被catch捕捉,因而執(zhí)行rollback()而取消前面的正確執(zhí)行sql的操作結(jié)果,如果沒有發(fā)生錯(cuò)誤,則最后我們使用commit()來提交操作。(3)dao組件daoimple類的完整的代碼為

40、了能夠讓讀者真正掌握如何在spring框架中實(shí)現(xiàn)編程式的事務(wù)管理的代碼,下面給出dao組件daoimple類的完整的代碼。請見下面的【例9-17】中的代碼示例?!纠?-17】 dao組件daoimple類的完整的代碼示例package com.px1987.springwebapp.dao;import com.px1987.springwebapp.model.userinfovo;import org.springframework.jdbc.core.*;import java.util.*;import org.springframework.transaction.support.d

41、efaulttransactiondefinition;import org.springframework.transaction.transactionstatus;import org.springframework.dao.dataaccessexception;import org.springframework.transaction.platformtransactionmanager;public class daoimple implements daointerface private platformtransactionmanager transactionmanage

42、r;public void settransactionmanager(platformtransactionmanager transactionmanager) this.transactionmanager = transactionmanager; jdbctemplate jdbctemplate=null;public void setjdbctemplate(jdbctemplate jdbctemplate) this.jdbctemplate = jdbctemplate;public daoimple()public boolean updateoneuserinfo(us

43、erinfovo oneuserinfovo,string newuserpassword) string username=oneuserinfovo.getusername(); string userpassword=oneuserinfovo.getuserpassword(); object parameter=newuserpassword,username,userpassword; string updatesql1 = "update userinfo set userpassword = ? where username =? and userpassword=?

44、" string updatesql2 = "update abctable set userpassword = ? where username =? and userpassword=?" defaulttransactiondefinition def = new defaulttransactiondefinition(); transactionstatus status = transactionmanager.gettransaction(def); try this.jdbctemplate.update(updatesql1,parameter

45、); this.jdbctemplate.update(updatesql2,parameter); catch (dataaccessexception ex) transactionmanager.rollback(status); throw ex; transactionmmit(status);return true;3、修改springapp-servlet.xml配置文件添加下面的與事務(wù)相關(guān)的一些配置項(xiàng)目在下面的【例9-18】中所示的springapp-servlet.xml配置文件中,主要是添加drivermanagerdatasource、jdbctemplate、daoim

46、ple和datasourcetransactionmanager等類的對象實(shí)例的定義,并將各個(gè)相關(guān)的對象實(shí)例以屬性注入的方式注入到目標(biāo)組件類中?!纠?-18】 在項(xiàng)目的spring ioc的xml配置文件中添加與事務(wù)相關(guān)的一些配置標(biāo)簽<?xml version="1.0" encoding="utf-8"?><!doctype beans public "-/spring/dtd bean 2.0/en" "/dtd/spring-beans-2.0

47、.dtd"><beans><bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <property name="driverclassname"> <value>net.sourceforge.jtds.jdbc.driver</value> </property> <property name="url"><value>jdbc:jtds:sqlserver:/localhost:1433/webstudydb</value> </property> <property name="user

溫馨提示

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

評論

0/150

提交評論