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

下載本文檔

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

文檔簡介

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

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

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

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

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

6、org.springframework.orm.hibernate.HibernateTransactionManagate.HibernateTransactionManagerer當持久化機制是當持久化機制是hibernatehibernate時,用它來時,用它來管理事務管理事務org.springframework.jdo.JdoTraorg.springframework.jdo.JdoTransactionManagernsactionManager當持久化機制是當持久化機制是JdoJdo時,用它來管理事時,用它來管理事務。務。org.springframework.transact

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

25、事務的隔離級別, 超時時間,事務是否只讀, 傳播規(guī)則等等; TranscationStatus :描述事務的狀態(tài),代表了當前的事務,可以提交,回滾 PlatformTransactionManager: 事務管理器接口, 只定義了3個方法:getTransaction()獲取事務的狀態(tài); commit();rollback(); 事務管理器的實現(xiàn)類有多種,根據(jù)具體的持久層框架的不同而不同; 事務管理器實現(xiàn)類: DataSourceTransactionManager、HiberNateTransactionManager、 JdoTransactionManager等學習 創(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接口學習 創(chuàng)造 超越 共享27TransactionDefinition接口1:事務隔離:當前事務和其它事務的隔離的程度。例如,這個事務能否看到其他事務未提交的寫數(shù)據(jù)?2:事務傳播:通常在一個事務中執(zhí)行的所有代碼都會在這個事務中運行。但是,如果一個事務上下文已經(jīng)存在,有幾個選項可以指定一個事務性方法的執(zhí)行行為:例如,簡單地在現(xiàn)有的事務中繼續(xù)運行(大多數(shù)情況);或者掛起現(xiàn)有事務,創(chuàng)建一個新的事務。Spring提供EJB CMT中常見的事務傳播選項。3:事務超時: 事務在超時前能運行多久(自動被底層的事務基礎設施回滾)。4:只讀狀態(tài): 只讀事務不修改任何數(shù)據(jù)。只讀事務在某些情況下(例如當使用Hi

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

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

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

31、性 DefaultTransactionDefinition td = newnew DefaultTransactionDefinition(); td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); /5開啟事務,得到事務狀態(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、提交事務 txMmit(status); catchcatch (Exception e) /7、回滾事務 txManager.rollback(status); 直接使用PlatformTransactionManager學習 創(chuàng)造 超越 共享30使用TransactionTemplate管理事務TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回調(diào)方法,把應用程序從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。代碼片段: Tr

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

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

35、r);/5.定義事務屬性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管理事務學習 創(chuàng)造 超越 共享322022-3-6編程式事務示例 下面以Hibernate為例,來考查一下在實際開發(fā)中如何使用編程式事務來開發(fā)項目。示例:1、建立兩個實體:User和Log(用戶和日志)2、要求:在保存用戶時自動保存一份日志分析:完成上述功能,就涉及到對兩張表的保存,要么全成功,要么全失敗,為了能夠達到這樣的要求,因此必須采用事務來進行控制。學習 創(chuàng)造 超越 共享332022-3-6 使用編程式事務,

37、在Hibernate中獲取Session的方法需要使用如下方式才能保證對于同一個線程不同的表的操作才能在一個事務下控制: 在hibernate.cfg.xml文件中加入: thread說明:表示使用的是本地事務(jdbc事務)學習 創(chuàng)造 超越 共享342022-3-6 獲取Session的方法的改進 獲取Session時必須采用:getCurrentSession()說明:獲取的Session就會綁定到當前線程中,這樣再保存其它實體對象的時候就保證了也在同一事務下操作(因為是在同一個線程中),同時當提交事務或回滾事務后,Session會自動關(guān)閉,不用人為再進行關(guān)閉。學習 創(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進入系統(tǒng)); log.setDate(new Date(); LogManagerImpl logManager = new LogManagerImpl(); logManager.addLog(log); session.getTransaction().commit(); catch(Exception e) e.printStackTrace();session.getTransaction().rollback(); 學習 創(chuàng)造 超越 共享362022-3-6LogManagerImplpublic void addLog(Log log) HibernateUtils.

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

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

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

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

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

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

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

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

溫馨提示

  • 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

提交評論