Spring事務(wù)管理_第1頁
Spring事務(wù)管理_第2頁
Spring事務(wù)管理_第3頁
Spring事務(wù)管理_第4頁
Spring事務(wù)管理_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、學(xué)習(xí) 創(chuàng)造 超越 共享1學(xué)習(xí) 創(chuàng)造 超越 共享Spring事務(wù)管理 柳勇光學(xué)習(xí) 創(chuàng)造 超越 共享2事務(wù)基本概念編程式事務(wù)聲明式事務(wù)P8事務(wù)應(yīng)用QASpring事務(wù)管理大綱學(xué)習(xí) 創(chuàng)造 超越 共享3事務(wù)基本概念1.事務(wù)必須具備的4個(gè)特征a.原子性(Atomicity).要么成功提交,要么回滾b.一致性(Consistency).必須保證資源狀態(tài)的一致性c.隔離級(jí)別(Isolation).在事務(wù)執(zhí)行過程中,其操作資源的狀態(tài)信息不能夠被其他并發(fā)事務(wù)操作到d.持久性(Durablity).一旦事務(wù)提交,其結(jié)果應(yīng)該是持久的2.事務(wù)類型及其區(qū)別a.局部事務(wù)(本地,Local)b.全局事務(wù)(全局,Global

2、)學(xué)習(xí) 創(chuàng)造 超越 共享4c.局部事務(wù)與全局事務(wù)區(qū)別:操作的資源不同。本地事務(wù)全局事務(wù)事務(wù)基本概念學(xué)習(xí) 創(chuàng)造 超越 共享51、問題非基于Spring事務(wù)處理問題Session session = null;Transaction transaction = null;try session = factory.openSession(); /開啟事務(wù) transaction = session.beginTransaction(); transation.begin(); session.save(user); mit();/提交事務(wù) catch (Exception e) e.printSt

3、ackTrace(); transaction.rollback();/回滾事務(wù) return false;finally session.close();Connection conn = DataSourceUtils.getConnection(); /開啟事務(wù)conn.setAutoCommit(false);trytry Object retVal = callback.doInConnection(conn); mit(); /提交事務(wù) returnreturn retVal;catchcatch (Exception e) conn.rollback();/回滾事務(wù) throwt

4、hrow e;finallyfinally conn.close();缺點(diǎn):不一致的事務(wù)管理,編程復(fù)雜學(xué)習(xí) 創(chuàng)造 超越 共享6nSpring框架提供了一致的事務(wù)管理抽象,這帶來了以下好處:1. 為復(fù)雜的事務(wù)API提供了一致的編程模型,如JTA、JDBC、Hibernate、JPA和JDO2. 支持聲明式事務(wù)管理3. 提供比復(fù)雜的事務(wù)API(諸如JTA)更簡單的、更易于使用的編程式事務(wù)管理API4. 非常好地整合Spring的各種數(shù)據(jù)訪問抽象Spring事務(wù)處理Spring事務(wù)抽象的關(guān)鍵是事務(wù)策略的概念。這個(gè)概念由org.springframework.transaction.PlatformT

5、ransactionManager接口定義學(xué)習(xí) 創(chuàng)造 超越 共享7 Spring沒有直接管理事務(wù),而是將管理事務(wù)的責(zé)任委托給某個(gè)特定平臺(tái)的事務(wù)實(shí)現(xiàn)。事務(wù)管理器實(shí)現(xiàn)事務(wù)管理器實(shí)現(xiàn)目標(biāo)目標(biāo)org.springframework.jdbc.datasorg.springframework.jdbc.datasource.DataSourceTransactionMource.DataSourceTransactionManageranager在單一的在單一的JDBC DatasourceJDBC Datasource中的管理中的管理事務(wù)事務(wù)org.springframework.orm.hibern

6、org.springframework.orm.hibernate.HibernateTransactionManagate.HibernateTransactionManagerer當(dāng)持久化機(jī)制是當(dāng)持久化機(jī)制是hibernatehibernate時(shí),用它來時(shí),用它來管理事務(wù)管理事務(wù)org.springframework.jdo.JdoTraorg.springframework.jdo.JdoTransactionManagernsactionManager當(dāng)持久化機(jī)制是當(dāng)持久化機(jī)制是JdoJdo時(shí),用它來管理事時(shí),用它來管理事務(wù)。務(wù)。org.springframework.transact

7、.springframework.transaction.jta.JtaTransactionManagerjta.JtaTransactionManager使用一個(gè)使用一個(gè)JTAJTA實(shí)現(xiàn)來管理事務(wù)。在一個(gè)實(shí)現(xiàn)來管理事務(wù)。在一個(gè)事務(wù)跨越多個(gè)數(shù)據(jù)源時(shí)使用事務(wù)跨越多個(gè)數(shù)據(jù)源時(shí)使用org.springframework.orm.ojb.Peorg.springframework.orm.ojb.PersistenceBrokerTransactionManrsistenceBrokerTransactionManagerager當(dāng)當(dāng)apacheapache的的ojbojb用作持久化機(jī)

8、制時(shí),用用作持久化機(jī)制時(shí),用它來管理事務(wù)。它來管理事務(wù)。Spring的事務(wù)管理器的事務(wù)管理器學(xué)習(xí) 創(chuàng)造 超越 共享8SpringSpring的事務(wù)管理器的事務(wù)管理器platformTransactionmanagerplatformTransactionmanagerdatasourcedatasourceTransactionTransactionmanagermanagerhibernatehibernateTransactionTransactionmanagermanagerjdojdoTransactionTransactionmanagermanagerpersistenceper

9、sistenceBrokerBrokerTransactionTransactionmanagermanagerJTAJTATransactionTransactionmanagermanagerjdbcjdbchibernatehibernateJDOJDOOJBOJBJTAJTA每種事務(wù)管理器都充當(dāng)了對(duì)特定平臺(tái)的事務(wù)實(shí)現(xiàn)的代理。這樣我們就只需要和spring中的事務(wù)打交道,而不用關(guān)系實(shí)際上事務(wù)實(shí)現(xiàn)是什么樣的。要使用一個(gè)事務(wù)管理器,你得再上下文中聲明它。程序控制事務(wù)管理能讓你在代碼中精確定義事務(wù)邊界,聲明式事務(wù)幫助把一個(gè)操作從事務(wù)規(guī)則中分離出來。學(xué)習(xí) 創(chuàng)造 超越 共享92022-3-6事務(wù)的

10、傳播方式(1)PROPAGATION_REQUIREDPROPAGATION_REQUIRED 表示業(yè)務(wù)邏輯方法需要在一個(gè)事務(wù)中運(yùn)行,如果該方法在運(yùn)行時(shí),已經(jīng)處在一個(gè)事務(wù)中,則直接加入到該事務(wù)中,否則自己創(chuàng)建一個(gè)新的事務(wù)。即:如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟。PROPAGATION_SUPPORTSPROPAGATION_SUPPORTS 表示業(yè)務(wù)邏輯方法如果在某個(gè)事務(wù)范圍內(nèi)被調(diào)用,則該方法直接成為當(dāng)前事務(wù)的一部分。如果該方法在事務(wù)范圍外被調(diào)用,則該方法在無事務(wù)的環(huán)境下執(zhí)行。即:如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒有事務(wù),則非事務(wù)的執(zhí)行。學(xué)習(xí) 創(chuàng)造 超越 共享102022

11、-3-6PROPAGATION_MANDATORYPROPAGATION_MANDATORY 表示業(yè)務(wù)邏輯方法只能在一個(gè)已經(jīng)存在的事務(wù)中執(zhí)行,該方法不能創(chuàng)建自己的事務(wù),如果該方法在沒有事務(wù)的環(huán)境下被調(diào)用,容器就會(huì)拋出事務(wù)不存在的異常。 即:如果已經(jīng)存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒有一個(gè)活動(dòng)的事務(wù),則拋出異常。PROPAGATION_REQUIRES_NEWPROPAGATION_REQUIRES_NEW 表示不管當(dāng)前是否有事務(wù)存在,該業(yè)務(wù)邏輯方法都會(huì)為自己創(chuàng)建一個(gè)全新的事務(wù)。如果該方法已經(jīng)運(yùn)行在一個(gè)事務(wù)中,則原有事務(wù)會(huì)被掛起,新的事務(wù)會(huì)被創(chuàng)建,直到該方法執(zhí)行結(jié)束后新事務(wù)才算結(jié)束,原先的事務(wù)再

12、恢復(fù)執(zhí)行。即: 總是開啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起,新事務(wù)運(yùn)行完畢后,再接著運(yùn)行被掛起的事務(wù)。事務(wù)的傳播方式(2)(2)學(xué)習(xí) 創(chuàng)造 超越 共享112022-3-6PROPAGATION_NOT_SUPPORTEDPROPAGATION_NOT_SUPPORTED 表示業(yè)務(wù)邏輯方法不需要事務(wù)。如果該方法目前沒有關(guān)聯(lián)到某個(gè)事務(wù),容器不會(huì)為它創(chuàng)建事務(wù)。如果該方法在一個(gè)事務(wù)中被調(diào)用,則該事務(wù)會(huì)被掛起,在方法調(diào)用結(jié)束后原先的事務(wù)才會(huì)恢復(fù)執(zhí)行。即:總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù),當(dāng)前方法運(yùn)行完畢后,被掛起的事務(wù)才恢復(fù)執(zhí)行。事務(wù)的傳播方式(3)(3)學(xué)習(xí) 創(chuàng)造 超越

13、共享122022-3-6 PROPAGATION_NEVERPROPAGATION_NEVER 表示業(yè)務(wù)邏輯方法絕對(duì)不能在事務(wù)范圍內(nèi)執(zhí)行。如果該方法在某個(gè)事務(wù)中執(zhí)行,容器會(huì)拋出異常,只有沒有關(guān)聯(lián)到任何事務(wù)時(shí)該方法才能正常執(zhí)行。即:總是非事務(wù)地執(zhí)行,如果存在一個(gè)活動(dòng)事務(wù),則拋出異常。事務(wù)的傳播方式(4)(4)學(xué)習(xí) 創(chuàng)造 超越 共享132022-3-6 PROPAGATION_NESTEDPROPAGATION_NESTED 表示如果一個(gè)活動(dòng)的事務(wù)存在,業(yè)務(wù)邏輯方法則運(yùn)行在一個(gè)嵌套的事務(wù)中,如果沒有活動(dòng)事務(wù),則按REQUIRED屬性執(zhí)行。它使用了一個(gè)單獨(dú)的事務(wù),這個(gè)事務(wù)擁有多個(gè)可以回滾的保存點(diǎn),內(nèi)

14、部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響,它只對(duì)DataSourceTransactionManager事務(wù)管理器生效。即:如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中。如果沒有活動(dòng)事務(wù),則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行。事務(wù)的傳播方式(5)(5)學(xué)習(xí) 創(chuàng)造 超越 共享14事務(wù)的傳播方式事務(wù)的傳播方式傳播行為意義PROPAGATION_REQUIRED表示當(dāng)前方法必須運(yùn)行在一個(gè)事務(wù)中。若一個(gè)現(xiàn)有的事務(wù)正在進(jìn)行中,該方法將會(huì)運(yùn)行在這個(gè)事務(wù)中。否則的話,就要開一個(gè)新的事務(wù)。PROPAGATION_REQUIRES_NEW表示當(dāng)前方法必

15、須運(yùn)行在它自己的事務(wù)里。他將啟動(dòng)一個(gè)新的事務(wù)。如果一個(gè)現(xiàn)有事務(wù)在運(yùn)行的話,將在這個(gè)方法運(yùn)行期間被掛起。PROPAGATION_SUPPORTS當(dāng)前方法不需要事務(wù)處理環(huán)境,但如果有一個(gè)事務(wù)已經(jīng)在運(yùn)行的話,這個(gè)方法也可以在這個(gè)事務(wù)里運(yùn)行。傳播規(guī)則回答了一個(gè)問題,就是新的事務(wù)是否要被啟動(dòng)或是掛起,或者方法是否要在事務(wù)環(huán)境中運(yùn)行。學(xué)習(xí) 創(chuàng)造 超越 共享15傳播行為意義PROPAGATION_MANDATORY該方法必須運(yùn)行在一個(gè)事務(wù)中。如果當(dāng)前事務(wù)不存在,將拋出一個(gè)異常。PROPAGATION_NESTED若當(dāng)前已經(jīng)存在一個(gè)事務(wù),則該方法應(yīng)當(dāng)運(yùn)行在一個(gè)嵌套的事務(wù)中。被嵌套的事務(wù)可以從當(dāng)前事務(wù)中單獨(dú)的提

16、交或回滾。若當(dāng)前事務(wù)不存在,則看起來就和PROPAGATION_REQUIRED沒有兩樣。PROPAGATION_NEVER當(dāng)前的方法不應(yīng)該運(yùn)行在一個(gè)事務(wù)上下文中。如果當(dāng)前存在一個(gè)事務(wù),則會(huì)拋出一個(gè)異常。PROPAGATION_NOT_SUPPORTED表示該方法不應(yīng)在事務(wù)中運(yùn)行。如果一個(gè)現(xiàn)有的事務(wù)正在運(yùn)行,他將在該方法的運(yùn)行期間被掛起。如果使用jta的事務(wù)管理器,需要訪問jtatansactionmanager.事務(wù)的傳播方式事務(wù)的傳播方式學(xué)習(xí) 創(chuàng)造 超越 共享162022-3-6事務(wù)播放方式圖示說明事務(wù)播放屬性事務(wù)播放屬性t1t1( (相當(dāng)于相當(dāng)于UserManagerImplUserMa

17、nagerImpl) ) t2 t2( (相當(dāng)于相當(dāng)于LogImpl)LogImpl)REQUIREDREQUIRED 無無 t1t1 t2(t2 t2(t2自已會(huì)開一個(gè)自已會(huì)開一個(gè)) ) t1( t1(如果如果t1t1開啟了事務(wù),則開啟了事務(wù),則t2t2直接使用直接使用t1t1開啟的事務(wù)開啟的事務(wù)) )REQUIRES_NEWREQUIRES_NEW 無無 t1t1 t2 t2 t2(t2 t2(t2會(huì)自已單獨(dú)開啟一個(gè)會(huì)自已單獨(dú)開啟一個(gè)新事務(wù),不會(huì)使用新事務(wù),不會(huì)使用t1t1的事務(wù)的事務(wù)) )SupportSupport 無無 t1t1 無無 t1(t1(如果有事務(wù),則直接使如果有事務(wù),則直

18、接使用,沒有就不用事務(wù)用,沒有就不用事務(wù)) )MANDATORYMANDATORY 無無 t1t1 拋異常(如果沒事務(wù)就拋異拋異常(如果沒事務(wù)就拋異常)常) t1(t1(如果有事務(wù),則直接使如果有事務(wù),則直接使用用) )NOT_SUPPORTEDNOT_SUPPORTED 無無 t1t1 無無 無(如果無(如果t1t1有事務(wù),則有事務(wù),則t2t2也也不用事務(wù),不支持事務(wù))不用事務(wù),不支持事務(wù))NEVERNEVER 無無 t1t1 無無 拋異常拋異常學(xué)習(xí) 創(chuàng)造 超越 共享17 隔離級(jí)別幾個(gè)概念 臟讀:一個(gè)事務(wù)讀取了另一個(gè)事務(wù)改寫但還未提交的數(shù)據(jù),如果這些數(shù)據(jù)被回滾,則讀到的數(shù)據(jù)是無效的。 不可重

19、復(fù)讀:一個(gè)事務(wù)執(zhí)行相同的查詢兩次或兩次以上,但每次查詢結(jié)果都不同。 幻讀:一個(gè)事務(wù)讀取了幾行記錄后,另一個(gè)事務(wù)插入一些記錄,幻讀就發(fā)生了。再后來的查詢中,第一個(gè)事務(wù)就會(huì)發(fā)現(xiàn)有些原來沒有的記錄。事務(wù)隔離級(jí)別(1 1)學(xué)習(xí) 創(chuàng)造 超越 共享18 隔離級(jí)別隔離級(jí)別含義ISOlATION_DEFAULT使用后端數(shù)據(jù)庫默認(rèn)的隔離級(jí)別ISOLATION_READ_UNCOMMITED允許你讀取還未提交后數(shù)據(jù)??赡軐?dǎo)致臟、幻、不可重復(fù)ISOLATION_READ_COMMITTED允許在并發(fā)事務(wù)已經(jīng)提交后讀取??煞乐古K讀,但幻讀和 不可重復(fù)讀仍可發(fā)生。ISOLATION_REPEATABLE_READ對(duì)相同

20、字段的多次讀取是一致的,除非數(shù)據(jù)被事務(wù)本身改變。可防止臟、不可重復(fù)讀,幻讀仍可能發(fā)生。ISOLATION_SERIALABLE完全服從ACID的隔離級(jí)別,確保不發(fā)生臟、幻、不可重復(fù)讀。這在所有的隔離級(jí)別中是最慢的,它是典型的通過完全鎖定在事務(wù)中涉及的數(shù)據(jù)表來完成的。事務(wù)隔離級(jí)別(2 2)學(xué)習(xí) 創(chuàng)造 超越 共享192022-3-6Spring中事務(wù)隔離級(jí)別(1) ISOLATION_DEFAULT ISOLATION_DEFAULT 這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級(jí)別.以下四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng) ISOLATION_R

21、EAD_UNCOMMITTEDISOLATION_READ_UNCOMMITTED 這是事務(wù)最低的隔離級(jí)別,它充許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。這種隔離級(jí)別會(huì)產(chǎn)生臟讀、不可重復(fù)讀和幻像讀。 ISOLATION_READ_COMMITTEDISOLATION_READ_COMMITTED 保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。學(xué)習(xí) 創(chuàng)造 超越 共享202022-3-6 ISOLATION_REPEATABLE_READISOLATION_REPEATABLE_READ 這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。

22、它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生,即:不可重復(fù)讀。 ISOLATION_SERIALIZABLEISOLATION_SERIALIZABLE 這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行。除了防止臟讀、不可重復(fù)讀外,還避免了幻像讀。但是并發(fā)性最差。Spring中事務(wù)隔離級(jí)別(2)學(xué)習(xí) 創(chuàng)造 超越 共享21 只讀 若對(duì)數(shù)據(jù)庫只進(jìn)行讀操作,可設(shè)置事務(wù)只讀的屬性,使用某些優(yōu)化措施。數(shù)據(jù)庫會(huì)進(jìn)行優(yōu)化處理。若使用hibernate作為持久化機(jī)制,聲明一個(gè)只讀事務(wù)會(huì)使hibernate的flush模式設(shè)置為FLUSH_NEVER。避免不必要的

23、數(shù)據(jù)同步,將所有更新延遲到事務(wù)的結(jié)束。事務(wù)只讀屬性學(xué)習(xí) 創(chuàng)造 超越 共享22 事務(wù)超時(shí) 若事務(wù)在長時(shí)間的運(yùn)行,會(huì)不必要的占用數(shù)據(jù)庫資源。設(shè)置超時(shí)后,會(huì)在指定的時(shí)間片回滾。將那些具有可能啟動(dòng)新事務(wù)的傳播行為的方法的事務(wù)設(shè)置超時(shí)才有意義(PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED)。事務(wù)超時(shí)學(xué)習(xí) 創(chuàng)造 超越 共享232022-3-6Spring事務(wù)管理的兩種方式 在Spring中實(shí)現(xiàn)事務(wù)管理有兩種方式, 一種是傳統(tǒng)的編程式事務(wù)管理編程式事務(wù)管理,也就是程序員在編寫程序代碼實(shí)現(xiàn)事務(wù)的管理,具體包括定義事務(wù)的開始、在

24、程序異常時(shí)進(jìn)行事務(wù)的回滾及程序正常執(zhí)行后的事務(wù)提交。 另一種則是基于AOP技術(shù)實(shí)現(xiàn)的聲明式事務(wù)管理聲明式事務(wù)管理,事務(wù)管理本身是一項(xiàng)共有的系統(tǒng)級(jí)服務(wù)功能,完全可以將事務(wù)管理抽象成一個(gè)事務(wù)切面,程序員不再關(guān)心事務(wù)管理的問題,把主要精力放在核心業(yè)務(wù)邏輯代碼的編寫上,然后在需要進(jìn)行事務(wù)管理的方法上切入事務(wù)切面,使之具有事務(wù)管理的功能,達(dá)到事務(wù)管理的目的。學(xué)習(xí) 創(chuàng)造 超越 共享24事務(wù)基本概念編程式事務(wù)聲明式事務(wù)P8事務(wù)應(yīng)用QASpring事務(wù)管理大綱學(xué)習(xí) 創(chuàng)造 超越 共享25Spring編程式事務(wù)管理 Spring事務(wù)處理核心類: TransactionDefinition :事務(wù)屬性定義 ,描述了

25、事務(wù)的隔離級(jí)別, 超時(shí)時(shí)間,事務(wù)是否只讀, 傳播規(guī)則等等; TranscationStatus :描述事務(wù)的狀態(tài),代表了當(dāng)前的事務(wù),可以提交,回滾 PlatformTransactionManager: 事務(wù)管理器接口, 只定義了3個(gè)方法:getTransaction()獲取事務(wù)的狀態(tài); commit();rollback(); 事務(wù)管理器的實(shí)現(xiàn)類有多種,根據(jù)具體的持久層框架的不同而不同; 事務(wù)管理器實(shí)現(xiàn)類: DataSourceTransactionManager、HiberNateTransactionManager、 JdoTransactionManager等學(xué)習(xí) 創(chuàng)造 超越 共享26

26、public interface PlatformTransactionManager TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException;PlatformTransactionManage

27、r接口學(xué)習(xí) 創(chuàng)造 超越 共享27TransactionDefinition接口1:事務(wù)隔離:當(dāng)前事務(wù)和其它事務(wù)的隔離的程度。例如,這個(gè)事務(wù)能否看到其他事務(wù)未提交的寫數(shù)據(jù)?2:事務(wù)傳播:通常在一個(gè)事務(wù)中執(zhí)行的所有代碼都會(huì)在這個(gè)事務(wù)中運(yùn)行。但是,如果一個(gè)事務(wù)上下文已經(jīng)存在,有幾個(gè)選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為:例如,簡單地在現(xiàn)有的事務(wù)中繼續(xù)運(yùn)行(大多數(shù)情況);或者掛起現(xiàn)有事務(wù),創(chuàng)建一個(gè)新的事務(wù)。Spring提供EJB CMT中常見的事務(wù)傳播選項(xiàng)。3:事務(wù)超時(shí): 事務(wù)在超時(shí)前能運(yùn)行多久(自動(dòng)被底層的事務(wù)基礎(chǔ)設(shè)施回滾)。4:只讀狀態(tài): 只讀事務(wù)不修改任何數(shù)據(jù)。只讀事務(wù)在某些情況下(例如當(dāng)使用Hi

28、bernate時(shí)),是一種非常有用的優(yōu)化。TransactionDefinition & TransactionStatus TransactionStatus 對(duì)象可能代表一個(gè)新的或已經(jīng)存在的事務(wù)(如果在當(dāng)前調(diào)用堆棧有一個(gè)符合條件的事務(wù)。如同J2EE事務(wù)環(huán)境,一個(gè) TransactionStatus 也是和執(zhí)行 線程綁定的)學(xué)習(xí) 創(chuàng)造 超越 共享28直接使用PlatformTransactionManager直接使用PlatformTransactionManager管理事務(wù)可以使用PlatformTransactionManager直接管理事務(wù)。簡單地通過一個(gè)bean引用給你的be

29、an傳遞一個(gè)你使用的 PlatformTransaction對(duì)象。然后,使用TransactionDefinition和TransactionStatus對(duì)象就可以發(fā)起、回滾、提交事務(wù)。一般流程如下:1 .聲明數(shù)據(jù)源2 .聲明一個(gè)事務(wù)管理類,例如DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等3 .在我們的代碼中加入事務(wù)處理代碼:/默認(rèn)的事務(wù)屬性是PROPAGATION_REQUIRED屬性/初始化事務(wù),參數(shù)定義事務(wù)的傳播類型 TransactionDefinition td = new

30、 TransactionDefinition();/獲得事務(wù)狀態(tài)TransactionStatus ts = transactionManager.getTransaction(td);try /do sth transactionMmit(ts);catch(Exception e)transactionManager.rollback(ts);學(xué)習(xí) 創(chuàng)造 超越 共享29 /3.獲取事務(wù)管理器 PlatformTransactionManager txManager = (PlatformTransactionManager) ctx.getBean(txManager); /4.定義事務(wù)屬

31、性 DefaultTransactionDefinition td = newnew DefaultTransactionDefinition(); td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); /5開啟事務(wù),得到事務(wù)狀態(tài) TransactionStatus status = txManager.getTransaction(td); trytry /6.執(zhí)行數(shù)據(jù)庫操作 System.out.println(jdbcTempate.queryForInt(select count(*) from tb

32、l_doc); /7、提交事務(wù) txMmit(status); catchcatch (Exception e) /7、回滾事務(wù) txManager.rollback(status); 直接使用PlatformTransactionManager學(xué)習(xí) 創(chuàng)造 超越 共享30使用TransactionTemplate管理事務(wù)TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回調(diào)方法,把應(yīng)用程序從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。代碼片段: Tr

33、ansactionTemplate tt = new TransactionTemplate();Object result = tt.execute(new TransactionCallback(). public Object doTransaction(TransactionStatus status). /do sth return null; );使用TransactionCallback()可以返回一個(gè)值。如果使用TransactionCallbackWithoutResult則沒有返回值。TransactionCallbackWithoutResult 執(zhí)行事務(wù)沒有返回值,例如

34、save、update、delete等等;TransactionCallback 執(zhí)行事務(wù)處理后有返回值,如find要返回結(jié)果集(List);使用TransactionTemplate管理事務(wù)學(xué)習(xí) 創(chuàng)造 超越 共享31/3.獲取事務(wù)管理器PlatformTransactionManager txManager = (PlatformTransactionManager) ctx.getBean(txManager); /4、定義事務(wù)管理的模板TransactionTemplate transactionTemplate = newnew TransactionTemplate(txManage

35、r);/5.定義事務(wù)屬性transactionTemplate. setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);/6.回調(diào),執(zhí)行真正的數(shù)據(jù)庫操作,如果需要返回值需要在回調(diào)里返回transactionTemplate.execute(newnew TransactionCallback() Override publicpublic Object doInTransaction(TransactionStatus status) /7.執(zhí)行數(shù)據(jù)庫操作 System.out.println(jdbcTempate

36、.queryForInt(select count(*) from tbl_doc); returnreturn nullnull; );使用TransactionTemplate管理事務(wù)學(xué)習(xí) 創(chuàng)造 超越 共享322022-3-6編程式事務(wù)示例 下面以Hibernate為例,來考查一下在實(shí)際開發(fā)中如何使用編程式事務(wù)來開發(fā)項(xiàng)目。示例:1、建立兩個(gè)實(shí)體:User和Log(用戶和日志)2、要求:在保存用戶時(shí)自動(dòng)保存一份日志分析:完成上述功能,就涉及到對(duì)兩張表的保存,要么全成功,要么全失敗,為了能夠達(dá)到這樣的要求,因此必須采用事務(wù)來進(jìn)行控制。學(xué)習(xí) 創(chuàng)造 超越 共享332022-3-6 使用編程式事務(wù),

37、在Hibernate中獲取Session的方法需要使用如下方式才能保證對(duì)于同一個(gè)線程不同的表的操作才能在一個(gè)事務(wù)下控制: 在hibernate.cfg.xml文件中加入: thread說明:表示使用的是本地事務(wù)(jdbc事務(wù))學(xué)習(xí) 創(chuàng)造 超越 共享342022-3-6 獲取Session的方法的改進(jìn) 獲取Session時(shí)必須采用:getCurrentSession()說明:獲取的Session就會(huì)綁定到當(dāng)前線程中,這樣再保存其它實(shí)體對(duì)象的時(shí)候就保證了也在同一事務(wù)下操作(因?yàn)槭窃谕粋€(gè)線程中),同時(shí)當(dāng)提交事務(wù)或回滾事務(wù)后,Session會(huì)自動(dòng)關(guān)閉,不用人為再進(jìn)行關(guān)閉。學(xué)習(xí) 創(chuàng)造 超越 共享352

38、022-3-6示例代碼:UserManagerImpl類代碼:public void addUser(User user) Session session = null;try /session = HibernateUtils.getSession(); session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); session.save(user); /保存日志 Log log = new Log(); log.setType(安全日志); log.setDeta

39、il(xxx進(jìn)入系統(tǒng)); log.setDate(new Date(); LogManagerImpl logManager = new LogManagerImpl(); logManager.addLog(log); session.getTransaction().commit(); catch(Exception e) e.printStackTrace();session.getTransaction().rollback(); 學(xué)習(xí) 創(chuàng)造 超越 共享362022-3-6LogManagerImplpublic void addLog(Log log) HibernateUtils.

40、getSessionFactory().getCurrentSession().save(log);學(xué)習(xí) 創(chuàng)造 超越 共享372022-3-6說明: thread 當(dāng)設(shè)置完該屬性后,Hibernate會(huì)將獲取到的Session綁定到當(dāng)前線程中,這樣再調(diào)用getCurrentSession()方法獲取Session時(shí),該方法首先查看當(dāng)前線程中有沒有Session對(duì)象,如果沒有,則從SessionFactory中獲取Session對(duì)象并把該Session對(duì)象綁定到當(dāng)前線程中,如果當(dāng)前線程中有Session對(duì)象,該方法則直接從當(dāng)前線程中取出Session對(duì)象直接使用,這樣就保證了在同一個(gè)線程請(qǐng)求中,

41、不管操作多少個(gè)實(shí)體對(duì)象使用的都是同一個(gè)Session對(duì)象,只要Session對(duì)象打開了事務(wù),那么這些不同的實(shí)體對(duì)象的操作都 處于同一個(gè)事務(wù)控制之下(因?yàn)檫@些實(shí)體對(duì)象使用的是同一個(gè)Session)。學(xué)習(xí) 創(chuàng)造 超越 共享382022-3-6編程式事務(wù)小結(jié)編程式能靈活控制事務(wù)邊界,但編程復(fù)雜需要在hibernate.cfg.xml文件中加入如下配置:如果使用的是本地事務(wù)(jdbc事務(wù)) threadthread如果使用的是全局事務(wù)(jta事務(wù)) jtajta獲取Session時(shí)需要使用getCurrentSession()采用getCurrentSession()創(chuàng)建的session會(huì)綁定到當(dāng)前線

42、程中,而采用openSession()創(chuàng)建的session則不會(huì)。采用getCurrentSession()創(chuàng)建的session在commit或rollback時(shí)會(huì)自動(dòng)關(guān)閉,而采用openSession()創(chuàng)建的session必須手動(dòng)關(guān)閉學(xué)習(xí) 創(chuàng)造 超越 共享39事務(wù)基本概念編程式事務(wù)聲明式事務(wù)P8事務(wù)應(yīng)用QASpring事務(wù)管理大綱學(xué)習(xí) 創(chuàng)造 超越 共享402022-3-6聲明式事務(wù) Spring為聲明式事務(wù)提供了簡單而強(qiáng)大的支持,所謂聲明式事務(wù),是指在Spring的配置文件中使用相應(yīng)的標(biāo)簽對(duì)事務(wù)進(jìn)行配置,這樣做的好處是Spring可以幫助我們管理事務(wù),例如:什么時(shí)候提交事務(wù)、什么時(shí)候回滾事

43、務(wù)等。 從開發(fā)效率與易維護(hù)的角度來看,Spring聲明式事務(wù)管理是實(shí)際開發(fā)中比較常用的。學(xué)習(xí) 創(chuàng)造 超越 共享4141 AOP(Aspect Oriented Programming)它是一種設(shè)計(jì)模式,用于實(shí)現(xiàn)一個(gè)系統(tǒng)中的某一個(gè)方面的應(yīng)用。 AOP的應(yīng)用 系統(tǒng)安全 事務(wù) 日志 審計(jì)AOPAOP簡介學(xué)習(xí) 創(chuàng)造 超越 共享4242 AOP的術(shù)語描述了AOP編程的各個(gè)方面: 切面(Aspect)描述的是一個(gè)應(yīng)用系統(tǒng)的某一個(gè)方面或領(lǐng)域,例如:日志,事務(wù),權(quán)限檢查等。 連接點(diǎn)(Joinpoint)連接點(diǎn)是應(yīng)用程序執(zhí)行過程中插入切面的點(diǎn),這些點(diǎn)可能是方法的調(diào)用,異常拋出或字段的修改等。 通知(Advise

44、)通知它是切面的具體實(shí)現(xiàn),它表示切面的行為,例如在日志的切面應(yīng)用中,日志通知包含了實(shí)現(xiàn)日志功能的具體代碼,例如向日志文件寫入日志信息等。AOPAOP術(shù)語學(xué)習(xí) 創(chuàng)造 超越 共享4343 切入點(diǎn)(Pointcut)切入點(diǎn)指定了通知應(yīng)當(dāng)應(yīng)用在那些連接點(diǎn)上,通知可以應(yīng)用到AOP框架支持的任何的連接點(diǎn),例如:根據(jù)方法名來確定切入點(diǎn)等,它指定了那些連接點(diǎn)需要被通知。 引入(Introduction)引入充許你為已存在的類添加新的方法和屬性。 目標(biāo)對(duì)象(Target):目標(biāo)對(duì)象是指被通知的對(duì)象,它是一個(gè)普通的業(yè)務(wù)對(duì)象,如果沒有AOP那么它其中可能包含大量的非核心業(yè)務(wù)邏輯代碼,例如日志,事務(wù)等,而如果使用了A

45、OP則其中只有核心的業(yè)務(wù)邏輯代碼。AOPAOP術(shù)語學(xué)習(xí) 創(chuàng)造 超越 共享4444 代理(Proxy)代理是指將通知應(yīng)用到目標(biāo)對(duì)象后形成的新的對(duì)象。它實(shí)現(xiàn)了與目標(biāo)對(duì)象一樣的功能,不同的是它添加了通知的應(yīng)用功能例如日志,事務(wù)等,對(duì)用戶而言它與目標(biāo)對(duì)象是一樣的。 織入(Weaving)織入是指將切面應(yīng)用到目標(biāo)對(duì)象從而建立一個(gè)新的代理對(duì)象的過程,切面在指定的接入點(diǎn)被織入目標(biāo)對(duì)象中,織入一般可發(fā)生在對(duì)象的編譯期,類裝載期或運(yùn)行期,Spring的AOP采用的是運(yùn)行期織入。AOPAOP術(shù)語學(xué)習(xí) 創(chuàng)造 超越 共享4545Spring AOP Spring的連接點(diǎn)模型是建立在方法攔截的基礎(chǔ)之上。 Spring在

46、方法調(diào)用的各個(gè)地方可織入通知,Spring有提供多種類型的通知,它們分別提供了不同的織入方式通知類型接口描述around MethodInterceptor攔截目標(biāo)方法的調(diào)用beforeBeforeAdvice調(diào)用目標(biāo)方法前通知afterAfterReturningAdvice調(diào)用目標(biāo)方法后通知throwsThrowsAdvice方法拋出異常時(shí)通知學(xué)習(xí) 創(chuàng)造 超越 共享4646Spring Aop的實(shí)現(xiàn) Spring中建立AOP應(yīng)用的基本步驟 建立目標(biāo)類及業(yè)務(wù)接口 Spring中注冊(cè)目標(biāo)類實(shí)例 建立通知類實(shí)現(xiàn)具體的通知接口 Spring中注冊(cè)通知類實(shí)例 配置目標(biāo)類的代理對(duì)象(織入通知形成代理對(duì)

47、象) 獲取代理對(duì)象,調(diào)用其中的業(yè)務(wù)方法學(xué)習(xí) 創(chuàng)造 超越 共享47聲明式事務(wù)的實(shí)施步驟1、定義(資源)DataSource/SessionFactory2、定義事務(wù)管理器(管理資源的事務(wù))3、定義事務(wù)通知:定義了如何實(shí)施事務(wù)(實(shí)施事務(wù)的方法名和對(duì)應(yīng)的事務(wù)屬性),需要使用事務(wù)管理器管理事務(wù),定義了如何選擇目標(biāo)對(duì)象的方法及實(shí)施的事務(wù)屬性4、定義advisor(切入點(diǎn)和事務(wù)通知):切入點(diǎn)選擇需要實(shí)施事務(wù)的目標(biāo)對(duì)象(一定是業(yè)務(wù)邏輯層)5、Spring織入事務(wù)通知到目標(biāo)對(duì)象(AOP代理)聲明式事務(wù)的實(shí)施步驟學(xué)習(xí) 創(chuàng)造 超越 共享48實(shí)施事務(wù)的步驟1、定義DataSource2、定義事務(wù)管理器3、定義事務(wù)通知:定義了如何實(shí)施事務(wù)(實(shí)施事務(wù)的方法名和對(duì)應(yīng)的事務(wù)屬性),需要使用事務(wù)管理器管理事務(wù),定義了如何選擇目標(biāo)對(duì)象的方法及實(shí)施的事務(wù)屬性4、定義advisor(切入點(diǎn)和事務(wù)通知):切入點(diǎn)選擇需要實(shí)施事務(wù)的目標(biāo)對(duì)象(一定是業(yè)務(wù)邏輯層)5、Spring織入事務(wù)通知到目標(biāo)對(duì)象(AOP代理)聲明式事務(wù)學(xué)習(xí) 創(chuàng)造 超越 共享49聲明式事務(wù)學(xué)習(xí) 創(chuàng)造 超越 共享50Spring事務(wù)管理器聲明式事務(wù)學(xué)習(xí) 創(chuàng)造 超越 共享51事務(wù)advice tx:method name=get / tx:method name= / 聲明式事務(wù)- -事務(wù)a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論