鍏ㄩ潰鍒嗘瀽 Spring 鐨勭紪绋嬪紡浜嬪姟绠$悊鍙婂零鏄庡紡浜嬪姟绠$悊

鍏ㄩ潰鍒嗘瀽 Spring 鐨勭紪绋嬪紡浜嬪姟绠$悊鍙婂0鏄庡紡浜嬪姟绠$悊

澹版槑寮忎簨鍔$鐞?/span>

Spring 鐨勫0鏄庡紡浜嬪姟绠$悊姒傝堪

Spring 鐨勫0鏄庡紡浜嬪姟绠$悊鍦ㄥ簳灞傛槸寤虹珛鍦?AOP 鐨勫熀纭€涔嬩笂鐨勩€傚叾鏈川鏄鏂规硶鍓嶅悗杩涜鎷︽埅锛岀劧鍚庡湪鐩爣鏂规硶寮€濮嬩箣鍓嶅垱寤烘垨鑰呭姞鍏ヤ竴涓簨鍔★紝鍦ㄦ墽琛屽畬鐩爣鏂规硶涔嬪悗鏍规嵁鎵ц鎯呭喌鎻愪氦鎴栬€呭洖婊氫簨鍔°€?/span>

澹版槑寮忎簨鍔℃渶澶х殑浼樼偣灏辨槸涓嶉渶瑕侀€氳繃缂栫▼鐨勬柟寮忕鐞嗕簨鍔★紝杩欐牱灏变笉闇€瑕佸湪涓氬姟閫昏緫浠g爜涓幒鏉備簨鍔$鐞嗙殑浠g爜锛屽彧闇€鍦ㄩ厤缃枃浠朵腑鍋氱浉鍏崇殑浜嬪姟瑙勫垯澹版槑锛堟垨閫氳繃绛変环鐨勫熀浜庢爣娉ㄧ殑鏂瑰紡锛夛紝渚垮彲浠ュ皢浜嬪姟瑙勫垯搴旂敤鍒颁笟鍔¢€昏緫涓€傚洜涓轰簨鍔$鐞嗘湰韬氨鏄竴涓吀鍨嬬殑妯垏閫昏緫锛屾鏄?AOP 鐨勭敤姝︿箣鍦般€係pring 寮€鍙戝洟闃熶篃鎰忚瘑鍒颁簡杩欎竴鐐癸紝涓哄0鏄庡紡浜嬪姟鎻愪緵浜嗙畝鍗曡€屽己澶х殑鏀寔銆?/span>

澹版槑寮忎簨鍔$鐞嗘浘缁忔槸 EJB 寮曚互涓哄偛鐨勪竴涓寒鐐癸紝濡備粖 Spring 璁?POJO 鍦ㄤ簨鍔$鐞嗘柟闈篃鎷ユ湁浜嗗拰 EJB 涓€鏍风殑寰呴亣锛岃寮€鍙戜汉鍛樺湪 EJB 瀹瑰櫒涔嬪涔熺敤涓婁簡寮哄ぇ鐨勫0鏄庡紡浜嬪姟绠$悊鍔熻兘锛岃繖涓昏寰楃泭浜?Spring 渚濊禆娉ㄥ叆瀹瑰櫒鍜?Spring AOP 鐨勬敮鎸併€備緷璧栨敞鍏ュ鍣ㄤ负澹版槑寮忎簨鍔$鐞嗘彁渚涗簡鍩虹璁炬柦锛屼娇寰?Bean 瀵逛簬 Spring 妗嗘灦鑰岃█鏄彲绠$悊鐨勶紱鑰?Spring AOP 鍒欐槸澹版槑寮忎簨鍔$鐞嗙殑鐩存帴瀹炵幇鑰咃紝杩欎竴鐐归€氳繃娓呭崟8鍙互鐪嬪嚭鏉ャ€?/span>

閫氬父鎯呭喌涓嬶紝绗旇€呭己鐑堝缓璁湪寮€鍙戜腑浣跨敤澹版槑寮忎簨鍔★紝涓嶄粎鍥犱负鍏剁畝鍗曪紝鏇翠富瑕佹槸鍥犱负杩欐牱浣垮緱绾笟鍔′唬鐮佷笉琚薄鏌擄紝鏋佸ぇ鏂逛究鍚庢湡鐨勪唬鐮佺淮鎶ゃ€?/span>

鍜岀紪绋嬪紡浜嬪姟鐩告瘮锛屽0鏄庡紡浜嬪姟鍞竴涓嶈冻鍦版柟鏄紝鍚庤€呯殑鏈€缁嗙矑搴﹀彧鑳戒綔鐢ㄥ埌鏂规硶绾у埆锛屾棤娉曞仛鍒板儚缂栫▼寮忎簨鍔¢偅鏍峰彲浠ヤ綔鐢ㄥ埌浠g爜鍧楃骇鍒€備絾鏄嵆渚挎湁杩欐牱鐨勯渶姹傦紝涔熷瓨鍦ㄥ緢澶氬彉閫氱殑鏂规硶锛屾瘮濡傦紝鍙互灏嗛渶瑕佽繘琛屼簨鍔$鐞嗙殑浠g爜鍧楃嫭绔嬩负鏂规硶绛夌瓑銆?/span>

涓嬮潰灏辨潵鐪嬬湅 Spring 涓烘垜浠彁渚涚殑澹版槑寮忎簨鍔$鐞嗗姛鑳姐€?/span>

鍩轰簬 TransactionInter... 鐨勫0鏄庡紡浜嬪姟绠$悊

鏈€鍒濓紝Spring 鎻愪緵浜?TransactionInterceptor 绫绘潵瀹炴柦澹版槑寮忎簨鍔$鐞嗗姛鑳姐€傚厛鐪嬫竻鍗?鐨勯厤缃枃浠讹細


娓呭崟 8. 鍩轰簬 TransactionInterceptor 鐨勪簨鍔$鐞嗙ず渚嬮厤缃枃浠?/strong>

<beans...>
......
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="bankServiceTarget"
class="footmark.spring.core.tx.declare.origin.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<bean id="bankService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="interceptorNames">
<list>
<idref bean="transactionInterceptor"/>
</list>
</property>
</bean>
......
</beans>

棣栧厛锛屾垜浠厤缃簡涓€涓?TransactionInterceptor 鏉ュ畾涔夌浉鍏崇殑浜嬪姟瑙勫垯锛屼粬鏈変袱涓富瑕佺殑灞炴€э細涓€涓槸 transactionManager锛岀敤鏉ユ寚瀹氫竴涓簨鍔$鐞嗗櫒锛屽苟灏嗗叿浣撲簨鍔$浉鍏崇殑鎿嶄綔濮旀墭缁欏畠锛涘彟涓€涓槸 Properties 绫诲瀷鐨?transactionAttributes 灞炴€э紝瀹冧富瑕佺敤鏉ュ畾涔変簨鍔¤鍒欙紝璇ュ睘鎬х殑姣忎竴涓敭鍊煎涓紝閿寚瀹氱殑鏄柟娉曞悕锛屾柟娉曞悕鍙互浣跨敤閫氶厤绗︼紝鑰屽€煎氨琛ㄧず鐩稿簲鏂规硶鐨勬墍搴旂敤鐨勪簨鍔″睘鎬с€?/span>

鎸囧畾浜嬪姟灞炴€х殑鍙栧€兼湁杈冨鏉傜殑瑙勫垯锛岃繖鍦?Spring 涓畻寰椾笂鏄竴浠惰浜哄ご鐤肩殑浜嬨€傚叿浣撶殑涔﹀啓瑙勫垯濡備笅锛?/span>

浼犳挱琛屼负 [锛岄殧绂荤骇鍒玗 [锛屽彧璇诲睘鎬 [锛岃秴鏃跺睘鎬 [涓嶅奖鍝嶆彁浜ょ殑寮傚父] [锛屽鑷村洖婊氱殑寮傚父]

  • 浼犳挱琛屼负鏄敮涓€蹇呴』璁剧疆鐨勫睘鎬э紝鍏朵粬閮藉彲浠ュ拷鐣ワ紝Spring涓烘垜浠彁渚涗簡鍚堢悊鐨勯粯璁ゅ€笺€?/span>
  • 浼犳挱琛屼负鐨勫彇鍊煎繀椤讳互鈥淧ROPAGATION_鈥濆紑澶达紝鍏蜂綋鍖呮嫭锛歅ROPAGATION_MANDATORY銆丳ROPAGATION_NESTED銆丳ROPAGATION_NEVER銆丳ROPAGATION_NOT_SUPPORTED銆丳ROPAGATION_REQUIRED銆丳ROPAGATION_REQUIRES_NEW銆丳ROPAGATION_SUPPORTS锛屽叡涓冪鍙栧€笺€?/span>
  • 闅旂绾у埆鐨勫彇鍊煎繀椤讳互鈥淚SOLATION_鈥濆紑澶达紝鍏蜂綋鍖呮嫭锛欼SOLATION_DEFAULT銆両SOLATION_READ_COMMITTED銆両SOLATION_READ_UNCOMMITTED銆両SOLATION_REPEATABLE_READ銆両SOLATION_SERIALIZABLE锛屽叡浜旂鍙栧€笺€?/span>
  • 濡傛灉浜嬪姟鏄彧璇荤殑锛岄偅涔堟垜浠彲浠ユ寚瀹氬彧璇诲睘鎬э紝浣跨敤鈥渞eadOnly鈥濇寚瀹氥€傚惁鍒欐垜浠笉闇€瑕佽缃灞炴€с€?/span>
  • 瓒呮椂灞炴€х殑鍙栧€煎繀椤讳互鈥淭IMEOUT_鈥濆紑澶达紝鍚庨潰璺熶竴涓猧nt绫诲瀷鐨勫€硷紝琛ㄧず瓒呮椂鏃堕棿锛屽崟浣嶆槸绉掋€?/span>
  • 涓嶅奖鍝嶆彁浜ょ殑寮傚父鏄寚锛屽嵆浣夸簨鍔′腑鎶涘嚭浜嗚繖浜涚被鍨嬬殑寮傚父锛屼簨鍔′换鐒舵甯告彁浜ゃ€傚繀椤诲湪姣忎竴涓紓甯哥殑鍚嶅瓧鍓嶉潰鍔犱笂鈥?鈥濄€傚紓甯哥殑鍚嶅瓧鍙互鏄被鍚嶇殑涓€閮ㄥ垎銆傛瘮濡傗€?RuntimeException鈥濄€佲€?tion鈥濈瓑绛夈€?/span>
  • 瀵艰嚧鍥炴粴鐨勫紓甯告槸鎸囷紝褰撲簨鍔′腑鎶涘嚭杩欎簺绫诲瀷鐨勫紓甯告椂锛屼簨鍔″皢鍥炴粴銆傚繀椤诲湪姣忎竴涓紓甯哥殑鍚嶅瓧鍓嶉潰鍔犱笂鈥?鈥濄€傚紓甯哥殑鍚嶅瓧鍙互鏄被鍚嶇殑鍏ㄩ儴鎴栬€呴儴鍒嗭紝姣斿鈥?RuntimeException鈥濄€佲€?tion鈥濈瓑绛夈€?/span>

浠ヤ笅鏄袱涓ず渚嬶細

<property name="*Service">
PROPAGATION_REQUIRED锛孖SOLATION_READ_COMMITTED锛孴IMEOUT_20锛?
+AbcException锛?DefException锛?HijException
</property>

浠ヤ笂琛ㄨ揪寮忚〃绀猴紝閽堝鎵€鏈夋柟娉曞悕浠?Service 缁撳熬鐨勬柟娉曪紝浣跨敤 PROPAGATION_REQUIRED 浜嬪姟浼犳挱琛屼负锛屼簨鍔$殑闅旂绾у埆鏄?ISOLATION_READ_COMMITTED锛岃秴鏃舵椂闂翠负20绉掞紝褰撲簨鍔℃姏鍑?AbcException 鎴栬€?DefException 绫诲瀷鐨勫紓甯革紝鍒欎粛鐒舵彁浜わ紝褰撴姏鍑?HijException 绫诲瀷鐨勫紓甯告椂蹇呴』鍥炴粴浜嬪姟銆傝繖閲屾病鏈夋寚瀹?readOnly"锛岃〃绀轰簨鍔′笉鏄彧璇荤殑銆?/span>

<property name="test">PROPAGATION_REQUIRED锛宺eadOnly</property>

浠ヤ笂琛ㄨ揪寮忚〃绀猴紝閽堝鎵€鏈夋柟娉曞悕涓?test 鐨勬柟娉曪紝浣跨敤 PROPAGATION_REQUIRED 浜嬪姟浼犳挱琛屼负锛屽苟涓旇浜嬪姟鏄彧璇荤殑銆傞櫎姝や箣澶栵紝鍏朵粬鐨勫睘鎬у潎浣跨敤榛樿鍊笺€傛瘮濡傦紝闅旂绾у埆鍜岃秴鏃舵椂闂翠娇鐢ㄥ簳灞備簨鍔℃€ц祫婧愮殑榛樿鍊硷紝骞朵笖褰撳彂鐢熸湭妫€鏌ュ紓甯革紝鍒欏洖婊氫簨鍔★紝鍙戠敓宸叉鏌ュ紓甯稿垯浠嶆彁浜や簨鍔°€?/span>

閰嶇疆濂戒簡 TransactionInterceptor锛屾垜浠繕闇€瑕侀厤缃竴涓?ProxyFactoryBean 鏉ョ粍瑁?target 鍜宎dvice銆傝繖涔熸槸鍏稿瀷鐨?Spring AOP 鐨勫仛娉曘€傞€氳繃 ProxyFactoryBean 鐢熸垚鐨勪唬鐞嗙被灏辨槸缁囧叆浜嗕簨鍔$鐞嗛€昏緫鍚庣殑鐩爣绫汇€傝嚦姝わ紝澹版槑寮忎簨鍔$鐞嗗氨绠楁槸瀹炵幇浜嗐€傛垜浠病鏈夊涓氬姟浠g爜杩涜浠讳綍鎿嶄綔锛屾墍鏈夎缃潎鍦ㄩ厤缃枃浠朵腑瀹屾垚锛岃繖灏辨槸澹版槑寮忎簨鍔$殑鏈€澶т紭鐐广€?/span>

鍩轰簬 TransactionProxy... 鐨勫0鏄庡紡浜嬪姟绠$悊

鍓嶉潰鐨勫0鏄庡紡浜嬪姟铏界劧濂斤紝浣嗘槸鍗村瓨鍦ㄤ竴涓潪甯告伡浜虹殑闂锛氶厤缃枃浠跺お澶氥€傛垜浠繀椤婚拡瀵规瘡涓€涓洰鏍囧璞¢厤缃竴涓?ProxyFactoryBean锛涘彟澶栵紝铏界劧鍙互閫氳繃鐖跺瓙 Bean 鐨勬柟寮忔潵澶嶇敤 TransactionInterceptor 鐨勯厤缃紝浣嗘槸瀹為檯鐨勫鐢ㄥ嚑鐜囦篃涓嶉珮锛涜繖鏍凤紝鍔犱笂鐩爣瀵硅薄鏈韩锛屾瘡涓€涓笟鍔$被鍙兘闇€瑕佸搴斾笁涓?<bean/> 閰嶇疆锛岄殢鐫€涓氬姟绫荤殑澧炲锛岄厤缃枃浠跺皢浼氬彉寰楄秺鏉ヨ秺搴炲ぇ锛岀鐞嗛厤缃枃浠跺張鎴愪簡闂銆?/span>

涓轰簡缂撹В杩欎釜闂锛孲pring 涓烘垜浠彁渚涗簡 TransactionProxyFactoryBean锛岀敤浜庡皢TransactionInterceptor 鍜?ProxyFactoryBean 鐨勯厤缃悎浜屼负涓€銆傚娓呭崟9鎵€绀猴細


娓呭崟9. 鍩轰簬 TransactionProxyFactoryBean 鐨勪簨鍔$鐞嗙ず渚嬮厤缃枃浠?/strong>

<beans......>
......
<bean id="bankServiceTarget"
class="footmark.spring.core.tx.declare.classic.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<bean id="bankService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
......
</beans>

濡傛涓€鏉ワ紝閰嶇疆鏂囦欢涓庡厛鍓嶇浉姣旂畝鍖栦簡寰堝銆傛垜浠妸杩欑閰嶇疆鏂瑰紡绉颁负 Spring 缁忓吀鐨勫0鏄庡紡浜嬪姟绠$悊銆傜浉淇″湪鏃╂湡浣跨敤 Spring 鐨勫紑鍙戜汉鍛樺杩欑閰嶇疆澹版槑寮忎簨鍔$殑鏂瑰紡涓€瀹氶潪甯哥啛鎮夈€?/span>

浣嗘槸锛屾樉寮忎负姣忎竴涓笟鍔$被閰嶇疆涓€涓?TransactionProxyFactoryBean 鐨勫仛娉曞皢浣垮緱浠g爜鏄惧緱杩囦簬鍒绘澘锛屼负姝ゆ垜浠彲浠ヤ娇鐢ㄨ嚜鍔ㄥ垱寤轰唬鐞嗙殑鏂瑰紡鏉ュ皢鍏剁畝鍖栵紝浣跨敤鑷姩鍒涘缓浠g悊鏄函 AOP 鐭ヨ瘑锛岃璇昏€呭弬鑰冪浉鍏虫枃妗o紝涓嶅湪姝よ禈杩般€?/span>

鍩轰簬 <tx> 鍛藉悕绌洪棿鐨勫0鏄庡紡浜嬪姟绠$悊

鍓嶉潰涓ょ澹版槑寮忎簨鍔¢厤缃柟寮忓瀹氫簡 Spring 澹版槑寮忎簨鍔$鐞嗙殑鍩虹煶銆傚湪姝ゅ熀纭€涓婏紝Spring 2.x 寮曞叆浜?<tx> 鍛藉悕绌洪棿锛岀粨鍚堜娇鐢?<aop> 鍛藉悕绌洪棿锛屽甫缁欏紑鍙戜汉鍛橀厤缃0鏄庡紡浜嬪姟鐨勫叏鏂颁綋楠岋紝閰嶇疆鍙樺緱鏇村姞绠€鍗曞拰鐏垫椿銆傚彟澶栵紝寰楃泭浜?<aop> 鍛藉悕绌洪棿鐨勫垏鐐硅〃杈惧紡鏀寔锛屽0鏄庡紡浜嬪姟涔熷彉寰楁洿鍔犲己澶с€?/span>

濡傛竻鍗?0鎵€绀猴細


娓呭崟10. 鍩轰簬 <tx> 鐨勪簨鍔$鐞嗙ず渚嬮厤缃枃浠?/strong>

<beans......>
......
<bean id="bankService" 
class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<tx:advice id="bankAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>
......
</beans>

濡傛灉榛樿鐨勪簨鍔″睘鎬у氨鑳芥弧瓒宠姹傦紝閭d箞浠g爜绠€鍖栦负濡傛竻鍗?11 鎵€绀猴細


娓呭崟 11. 绠€鍖栧悗鐨勫熀浜?<tx> 鐨勪簨鍔$鐞嗙ず渚嬮厤缃枃浠?/strong>

<beans......>
......
<bean id="bankService"
class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<tx:advice id="bankAdvice" transaction-manager="transactionManager">
<aop:config>
<aop:pointcut id="bankPointcut" expression="execution(**.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>
......
</beans>

鐢变簬浣跨敤浜嗗垏鐐硅〃杈惧紡锛屾垜浠氨涓嶉渶瑕侀拡瀵规瘡涓€涓笟鍔$被鍒涘缓涓€涓唬鐞嗗璞′簡銆傚彟澶栵紝濡傛灉閰嶇疆鐨勪簨鍔$鐞嗗櫒 Bean 鐨勫悕瀛楀彇鍊间负鈥渢ransactionManager鈥濓紝鍒欐垜浠彲浠ョ渷鐣?<tx:advice> 鐨?transaction-manager 灞炴€э紝鍥犱负璇ュ睘鎬х殑榛樿鍊煎嵆涓衡€渢ransactionManager鈥濄€?/span>

鍩轰簬 @Transactional 鐨勫0鏄庡紡浜嬪姟绠$悊

闄や簡鍩轰簬鍛藉悕绌洪棿鐨勪簨鍔¢厤缃柟寮忥紝Spring 2.x 杩樺紩鍏ヤ簡鍩轰簬 Annotation 鐨勬柟寮忥紝鍏蜂綋涓昏娑夊強@Transactional 鏍囨敞銆侤Transactional 鍙互浣滅敤浜庢帴鍙c€佹帴鍙f柟娉曘€佺被浠ュ強绫绘柟娉曚笂銆傚綋浣滅敤浜庣被涓婃椂锛岃绫荤殑鎵€鏈?public 鏂规硶灏嗛兘鍏锋湁璇ョ被鍨嬬殑浜嬪姟灞炴€э紝鍚屾椂锛屾垜浠篃鍙互鍦ㄦ柟娉曠骇鍒娇鐢ㄨ鏍囨敞鏉ヨ鐩栫被绾у埆鐨勫畾涔夈€傚娓呭崟12鎵€绀猴細


娓呭崟12. 鍩轰簬 @Transactional 鐨勪簨鍔$鐞嗙ず渚嬮厤缃枃浠?/strong>

@Transactional(propagation = Propagation.REQUIRED)
public boolean transfer(Long fromId锛?Long toId锛?double amount) {
return bankDao.transfer(fromId锛?toId锛?amount);
}

Spring 浣跨敤 BeanPostProcessor 鏉ュ鐞?Bean 涓殑鏍囨敞锛屽洜姝ゆ垜浠渶瑕佸湪閰嶇疆鏂囦欢涓綔濡備笅澹版槑鏉ユ縺娲昏鍚庡鐞?Bean锛屽娓呭崟13鎵€绀猴細


娓呭崟13. 鍚敤鍚庡鐞咮ean鐨勯厤缃?/strong>

<tx:annotation-driven transaction-manager="transactionManager"/>

涓庡墠闈㈢浉浼硷紝transaction-manager 灞炴€х殑榛樿鍊兼槸 transactionManager锛屽鏋滀簨鍔$鐞嗗櫒 Bean 鐨勫悕瀛楀嵆涓鸿鍊硷紝鍒欏彲浠ョ渷鐣ヨ灞炴€с€?/span>

铏界劧 @Transactional 娉ㄨВ鍙互浣滅敤浜庢帴鍙c€佹帴鍙f柟娉曘€佺被浠ュ強绫绘柟娉曚笂锛屼絾鏄?Spring 灏忕粍寤鸿涓嶈鍦ㄦ帴鍙f垨鑰呮帴鍙f柟娉曚笂浣跨敤璇ユ敞瑙o紝鍥犱负杩欏彧鏈夊湪浣跨敤鍩轰簬鎺ュ彛鐨勪唬鐞嗘椂瀹冩墠浼氱敓鏁堛€傚彟澶栵紝 @Transactional 娉ㄨВ搴旇鍙搴旂敤鍒?public 鏂规硶涓婏紝杩欐槸鐢?Spring AOP 鐨勬湰璐ㄥ喅瀹氱殑銆傚鏋滀綘鍦?protected銆乸rivate 鎴栬€呴粯璁ゅ彲瑙佹€х殑鏂规硶涓婁娇鐢?@Transactional 娉ㄨВ锛岃繖灏嗚蹇界暐锛屼篃涓嶄細鎶涘嚭浠讳綍寮傚父銆?/span>

鍩轰簬 <tx> 鍛藉悕绌洪棿鍜屽熀浜?@Transactional 鐨勪簨鍔″0鏄庢柟寮忓悇鏈変紭缂虹偣銆傚熀浜?<tx> 鐨勬柟寮忥紝鍏朵紭鐐规槸涓庡垏鐐硅〃杈惧紡缁撳悎锛屽姛鑳藉己澶с€傚埄鐢ㄥ垏鐐硅〃杈惧紡锛屼竴涓厤缃彲浠ュ尮閰嶅涓柟娉曪紝鑰屽熀浜?@Transactional 鐨勬柟寮忓繀椤诲湪姣忎竴涓渶瑕佷娇鐢ㄤ簨鍔$殑鏂规硶鎴栬€呯被涓婄敤 @Transactional 鏍囨敞锛屽敖绠″彲鑳藉ぇ澶氭暟浜嬪姟鐨勮鍒欐槸涓€鑷寸殑锛屼絾鏄 @Transactional 鑰岃█锛屼篃鏃犳硶閲嶇敤锛屽繀椤婚€愪釜鎸囧畾銆傚彟涓€鏂归潰锛屽熀浜?@Transactional 鐨勬柟寮忎娇鐢ㄨ捣鏉ラ潪甯哥畝鍗曟槑浜嗭紝娌℃湁瀛︿範鎴愭湰銆傚紑鍙戜汉鍛樺彲浠ユ牴鎹渶瑕侊紝浠婚€夊叾涓竴绉嶄娇鐢紝鐢氳嚦涔熷彲浠ユ牴鎹渶瑕佹贩鍚堜娇鐢ㄨ繖涓ょ鏂瑰紡銆?/span>

濡傛灉涓嶆槸瀵归仐鐣欎唬鐮佽繘琛岀淮鎶わ紝鍒欎笉寤鸿鍐嶄娇鐢ㄥ熀浜?TransactionInterceptor 浠ュ強鍩轰簬TransactionProxyFactoryBean 鐨勫0鏄庡紡浜嬪姟绠$悊鏂瑰紡锛屼絾鏄紝瀛︿範杩欎袱绉嶆柟寮忛潪甯告湁鍒╀簬瀵瑰簳灞傚疄鐜扮殑鐞嗚В銆?/span>

铏界劧涓婇潰鍏卞垪涓句簡鍥涚澹版槑寮忎簨鍔$鐞嗘柟寮忥紝浣嗘槸杩欐牱鐨勫垝鍒嗗彧鏄负浜嗕究浜庣悊瑙o紝鍏跺疄鍚庡彴鐨勫疄鐜版柟寮忔槸涓€鏍风殑锛屽彧鏄敤鎴蜂娇鐢ㄧ殑鏂瑰紡涓嶅悓鑰屽凡銆?/span>

鏈暀绋嬬殑鐭ヨ瘑鐐瑰ぇ鑷存€荤粨濡備笅锛?/span>

  • 鍩轰簬 TransactionDefinition銆丳latformTransactionManager銆乀ransactionStatus 缂栫▼寮忎簨鍔$鐞嗘槸 Spring 鎻愪緵鐨勬渶鍘熷鐨勬柟寮忥紝閫氬父鎴戜滑涓嶄細杩欎箞鍐欙紝浣嗘槸浜嗚В杩欑鏂瑰紡瀵圭悊瑙?Spring 浜嬪姟绠$悊鐨勬湰璐ㄦ湁寰堝ぇ浣滅敤銆?/span>
  • 鍩轰簬 TransactionTemplate 鐨勭紪绋嬪紡浜嬪姟绠$悊鏄涓婁竴绉嶆柟寮忕殑灏佽锛屼娇寰楃紪鐮佹洿绠€鍗曘€佹竻鏅般€?/span>
  • 鍩轰簬 TransactionInterceptor 鐨勫0鏄庡紡浜嬪姟鏄?Spring 澹版槑寮忎簨鍔$殑鍩虹锛岄€氬父涔熶笉寤鸿浣跨敤杩欑鏂瑰紡锛屼絾鏄笌鍓嶉潰涓€鏍凤紝浜嗚В杩欑鏂瑰紡瀵圭悊瑙?Spring 澹版槑寮忎簨鍔℃湁寰堝ぇ浣滅敤銆?/span>
  • 鍩轰簬 TransactionProxyFactoryBean 鐨勫0鏄庡紡浜嬪姟鏄笂涓柟寮忕殑鏀硅繘鐗堟湰锛岀畝鍖栫殑閰嶇疆鏂囦欢鐨勪功鍐欙紝杩欐槸 Spring 鏃╂湡鎺ㄨ崘鐨勫0鏄庡紡浜嬪姟绠$悊鏂瑰紡锛屼絾鏄湪 Spring 2.0 涓凡缁忎笉鎺ㄨ崘浜嗐€?/span>
  • 鍩轰簬 <tx> 鍜?<aop> 鍛藉悕绌洪棿鐨勫0鏄庡紡浜嬪姟绠$悊鏄洰鍓嶆帹鑽愮殑鏂瑰紡锛屽叾鏈€澶х壒鐐规槸涓?Spring AOP 缁撳悎绱у瘑锛屽彲浠ュ厖鍒嗗埄鐢ㄥ垏鐐硅〃杈惧紡鐨勫己澶ф敮鎸侊紝浣垮緱绠$悊浜嬪姟鏇村姞鐏垫椿銆?/span>
  • 鍩轰簬 @Transactional 鐨勬柟寮忓皢澹版槑寮忎簨鍔$鐞嗙畝鍖栧埌浜嗘瀬鑷淬€傚紑鍙戜汉鍛樺彧闇€鍦ㄩ厤缃枃浠朵腑鍔犱笂涓€琛屽惎鐢ㄧ浉鍏冲悗澶勭悊 Bean 鐨勯厤缃紝鐒跺悗鍦ㄩ渶瑕佸疄鏂戒簨鍔$鐞嗙殑鏂规硶鎴栬€呯被涓婁娇鐢?@Transactional 鎸囧畾浜嬪姟瑙勫垯鍗冲彲瀹炵幇浜嬪姟绠$悊锛岃€屼笖鍔熻兘涔熶笉蹇呭叾浠栨柟寮忛€婅壊銆?/span>