聽 聽 聽 聽 鍏充簬鍏蜂綋鐨凷pring浜嬪姟閰嶇疆锛岃櫧鐒舵瘮杈冨熀纭€锛屼絾鎴戣繕鏄啓鍦ㄨ繖閲屽惂锛屽湪浜嬪姟閰嶇疆杩囩▼涓紝鎴戠┛鎻掔潃鎻忚堪涓€浜涘師鐞嗘€х殑涓滆タ锛屽洜涓哄ご鑴戞瘮杈冩贩涔憋紝鏉$悊涓嶆竻锛岃繕鏈涘ぇ瀹舵捣娑点€?/div>
聽 聽 聽 聽 浜嬪姟绠$悊閰嶇疆鐨勬牳蹇冩槸鍚勭鍏蜂綋PlatformTransactionManager鐨勯厤缃紝鍏舵灏辨槸鍚勭浜嬪姟绠$悊鍣ㄥ浣曚綔鐢ㄥ湪鍏蜂綋鎿嶄綔鏂规硶涓婄殑鍒囬潰閰嶇疆锛屽洜涓轰簨鍔$鐞嗗櫒鍒板叿浣撴柟娉曠殑鍒囬潰閰嶇疆閮芥槸涓€鑷寸殑锛岃繖閲屾垜浠粰鍑哄悇绉?span style="font-size: 13px;">PlatformTransactionManager鐨勯厤缃紝鏈€鍚庡湪鏉ヤ竴涓叿浣撶殑浜嬪姟鍒囬潰閰嶇疆锛岃繖閲屾垜浠彁渚?span style="font-size: 14px;">DataSourceTransactionManager銆丣taTransactionManager浠ュ強HibernateTransactionManager鐨勯厤缃紝鍏充簬鐢╔ML閰嶇疆杩樻槸娉ㄨВ閰嶇疆锛岃繖閲屾垜浠厛鎻愪緵XML鐨勯厤缃紝鐒跺悗鍦ㄥ悗闈㈢粰鍑轰竴涓畬鍏ㄦ敞瑙g殑閰嶇疆瀹炰緥銆?/span>
PlatformTransactionManager閰嶇疆
1. DataSourceTransactionManager
棣栧厛闇€瑕侀厤缃甁DBC鐨凞ataSource锛屾瘯绔熻繖浜涙湰鍦颁簨鍔℃槸璧勬簮鐗瑰畾鐨勫槢锛孌ataSource瀹氫箟濡備笅
<bean聽id="dataSource"聽class="org.apache.commons.dbcp.BasicDataSource"聽destroy-method="close">
聽 聽 <property聽name="driverClassName"聽value="${jdbc.driverClassName}"聽/>
聽 聽 <property聽name="url"聽value="${jdbc.url}"聽/>
聽 聽 <property聽name="username"聽value="${jdbc.username}"聽/>
聽 聽 <property聽name="password"聽value="${jdbc.password}"聽/>
</bean>
鎺ョ潃灏辨槸浜嬪姟绠$悊鍣ㄧ殑閰嶇疆锛孌ataSourceTransactionManager瀹氫箟濡備笅
<bean聽id="txManager"聽class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property聽name="dataSource"聽ref="dataSource"/>
</bean>
杩欓噷浜嬪姟绠$悊鍣ㄥ氨閰嶇疆瀹屼簡锛岄潪甯哥畝鍗曘€?/span>
2.聽JtaTransactionManager
JtaTransactionManager閰嶇疆鏇翠负绠€鍗曪紝鍥犱负鍏舵槸鍏ㄥ眬浜嬪姟锛屼负瀹瑰櫒鎵樼浜嬪姟锛屽叾涓嶉渶瑕佺煡閬撶壒瀹氱殑璧勬簮锛圖ataSource锛夛紝閰嶇疆濡備笅
<bean聽id="txManager"聽class="org.springframework.transaction.jta.JtaTransactionManager"聽/>
浣嗘槸娉ㄦ剰JtaTransactionManager涓嶉渶瑕佺煡閬揇ataSource锛屽苟涓嶆剰鍛崇潃涓嶉渶瑕侀厤缃紝Spring Data妯″潡瀵硅祫婧愮殑鎿嶄綔杩樻槸闇€瑕丏ataSource鐨勶紝鍦ㄨ繖绉嶅満鏅笅DataSource鐢卞簲鐢ㄥ鍣ㄦ墭绠★紝鎵€浠ヤ娇鐢↗NDI杩涜鏌ユ壘寮曠敤锛屽涓?/span>
<jee:jndi-lookup聽id="dataSource"聽jndi-name="jdbc/jpetstore"/>
3.HibernateTransactionManager
Hibernate鐨勯厤缃瘮杈冨涓€浜涳紝棣栧厛鏄厤缃瓺ataSource锛屽拰1涓竴鑷达紝杩欓噷涓嶅啀璧樿堪锛屾帴鐫€灏辨槸SessionFactory鐨勯厤缃紝閰嶇疆濡備笅
<bean聽id="sessionFactory"聽class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
聽 聽 <property聽name="dataSource"聽ref="dataSource"聽/>
聽 聽 <property聽name="mappingResources">
聽 聽 聽 聽 <list>
聽 聽 聽 聽 聽 聽 <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value>
聽 聽 聽 聽 </list>
聽 聽 </property>
聽 聽 <property聽name="hibernateProperties">
聽 聽 聽 聽 <value>
聽 聽 聽 聽 聽 聽 hibernate.dialect=${hibernate.dialect}
聽 聽 聽 聽 </value>
聽 聽 聽 聽</property>
</bean>
娉ㄦ剰杩欓噷鐨勯厤缃瘮杈冭€侊紝濡傛灉浣跨敤鍩轰簬娉ㄨВ鐨勫疄浣撻厤缃紝璇峰皢mappingResources鏇挎崲涓?/div>
<property name="packagesToScan">
聽 聽<list>
聽 聽 <value>com.app</value>
聽 聽</list>
</property>
鎺ョ潃灏辨槸HibernateTransactionManager鐨勯厤缃簡锛岄厤缃涓?/div>
<bean聽id="txManager"聽class="org.springframework.orm.hibernate3.HibernateTransactionManager">
聽 聽 <property聽name="sessionFactory"聽ref="sessionFactory"聽/>
</bean>
聽 聽 娉ㄦ剰瀹為檯鐨勬寔涔呭寲鎶€鏈緥濡侸DBC銆丣PA銆丣DO銆丠ibernate绛夊拰瀹為檯浣跨敤鐨勪簨鍔$鐞嗗櫒涔嬮棿鐨勫尯鍒紝鍏舵病鏈夊繀瑕佷竴涓€瀵瑰簲锛屽湪浣跨敤JDBC鏃跺彲浠ヤ娇鐢↗TA鍏ㄥ眬浜嬪姟绠$悊鍣紝鍚屾牱锛屼娇鐢℉ibernate涔熷彲浠ワ紝鍙渶灏嗘渶鍚庝竴姝ョ殑浜嬪姟绠$悊鍣ㄦ浛鎹负JtaTransactionManager鍗冲彲銆?/div>
浜嬪姟绠$悊鍣ㄥ埌鐗瑰畾鏂规硶閰嶇疆
聽
聽 聽 鎺ヤ笅鏉ュ氨鏄叿浣撲簨鍔$鐞嗗櫒濡備綍浣滅敤鍦ㄥ叿浣撴柟娉曚笂鐨勯厤缃簡锛屼笉杩囧湪杩欎箣鍓嶆垜浠弿杩颁竴涓嬭繖涓娇鐢ㄨ儗鏅紝濡傚墠鎵€杩帮紝Spring鎻愪緵浜嗕袱绉嶄簨鍔$鐞嗘柟寮忥紝涓€绉嶆槸澹版槑寮忎簨鍔$鐞嗭紙Declarative transaction management锛夛紝鍙︿竴绉嶅垯鏄紪绋嬪紡浜嬪姟绠$悊锛圥rogrammatic transaction management锛夛紝杩欎袱绉嶆柟寮忔樉鐒跺0鏄庡紡姣旇緝绠€鍗曪紝鑰屽湪浜嬪姟绠$悊闇€姹傛瘮杈冨皯鐨勬椂鍊欙紝鎯虫瘮杈冨0鏄庡紡姣旇緝绻佺悙鐨勯厤缃紝缂栫▼寮忓垯姣旇緝绠€鍗曪紝杩欓噷澶у鏍规嵁鑷繁鐨勯渶姹傝繘琛岄€夋嫨锛孲pring瀹樻柟鎺ㄨ崘浣跨敤澹版槑寮忎簨鍔$鐞嗭紝鍚庨潰鐨勮杩颁篃浼氬垎鍒粰鍑哄0鏄庡紡浜嬪姟鍜岀紪绋嬪紡浜嬪姟鐩稿叧涓婚銆?/span>
澹版槑寮忛厤缃?/strong>
聽 聽 澹版槑寮忎簨鍔$鐞嗙殑鍩烘湰鍘熺悊鏄埄鐢ㄥ湪Spring涓簲鐢ㄦ瘮杈冨箍娉涚殑闈㈠悜鍒囬潰缂栫▼锛圓OP锛夛紝閫氳繃灏嗕簨鍔″鐞嗘斁鍦ㄥ垏闈㈠璞′腑鏉ヨ繘琛屼竴鑷存€х殑绠$悊锛屽噺灏戝啑浣欎唬鐮侊紝鎻愬崌绠€娲佹€э紝鍘熺悊鍥惧ぇ鑷村涓?/span>

聽
鍏朵腑鐨凙OP proxy锛孲pring瀹氫箟浜員ransactionInterceptor绫伙紝璇ョ被缁撴瀯濡備笅

聽
閫氳繃杩欎釜缁撴瀯锛屾垜浠湅鍒板疄闄呯殑鏂规硶閮藉湪TransactionInterceptor鐨勭埗绫籘ransactionAspectSupport涓紝TransactionInterceptor鐨勫叧閿柟娉曟槸invoke鏂规硶锛岃€岃繖涓柟娉曞唴閮ㄨ皟鐢ㄤ簡鐖剁被鐨刬nvokeWithinTransaction鏂规硶锛岃繖鏄繖閲屼簨鍔″鐞嗙殑鏍稿績锛宨nvokeWithinTransaction鏂规硶鐗囨濡備笅

聽
杩欑湅璧锋潵鏄竴涓吀鍨嬬殑鍒囬潰浠g悊鏂规硶锛屾垜浠寜鐓ч『搴忚涓嬩富瑕佹祦绋嬶紝棣栧厛270琛岃幏鍙栬鏂规硶鐨勪簨鍔″睘鎬э紝杩欎簺灞炴€у寘鎷簨鍔¢殧绂荤骇鍒€佷簨鍔′紶鎾瓥鐣ャ€佸彧璇汇€佸洖婊氱瓑灞炴€т俊鎭紝鐒跺悗271琛岃幏鍙栧钩鍙颁簨鍔$鐞嗗櫒锛屽洜涓篠pring鏀寔澶氫簨鍔$鐞嗗櫒鐗规€э紝杩欓噷闇€瑕侀厤鍚堝疄闄呴厤缃潵鍐冲畾鍏蜂綋鐨勪簨鍔$鐞嗗櫒锛屾敞鎰?76琛岋紝杩欎竴琛岃幏鍙栦簡浜嬪姟淇℃伅锛屽悓鏃跺張鍦ㄥ繀瑕佹儏鍐典笅寮€鍚簡浜嬪姟锛屽悗闈?81琛屾槸鍏蜂綋鏂规硶鎵ц锛?91琛屾彁浜や簨鍔°€?/div>
聽 聽 涓婇潰璇翠簡浜涘師鐞嗭紝杩欓噷缁欏嚭澹版槑寮忎簨鍔$殑涓€浜涘叿浣撳簲鐢ㄩ厤缃紝鍦⊿pring涓0鏄庡紡浜嬪姟澶т綋鏈変袱绉嶇敤娉曪紝涓€绉嶆槸绾补鐨勫垏闈㈤厤缃紝涓€绉嶆槸鍩轰簬@Transactional鐨勬敞瑙i厤缃紝杩欓噷閮戒細缁欏嚭鍏蜂綋搴旂敤瀹炰緥銆?/div>
聽 1.鍩轰簬鍒囬潰鐨勯厤缃?/strong>
聽 聽 鍩轰簬鐣岄潰鐨勯厤缃瘮杈冪畝鍗曪紝鏍稿績鏄疶ransaction 鐨凙dvice鐨勯厤缃紝鐒跺悗灏嗚繖Advice閰嶇疆鍦ㄥ叿浣損ointcut涓婂氨鍙互浜嗭紝鎴戜滑鍏堢湅鐪婣dvice鐨勯厤缃紝閰嶇疆瀹炰緥濡備笅锛?/div>
<tx:advice聽id="txAdvice"聽transaction-manager="txManager">
聽 聽 <!-- the transactional semantics... -->
聽 聽 <tx:attributes>
聽 聽 聽 聽 聽 聽 <!-- all methods starting with 'get' are read-only -->
聽 聽 聽 聽 <tx:method聽name="get*"聽read-only="true"/>
聽 聽 聽 聽 聽 <!-- other methods use the default transaction settings (see below) -->
聽 聽 聽 聽 <tx:method聽name="*"/>
聽 聽 </tx:attributes>
</tx:advice>
濡備笂锛岃繖閲岀殑閰嶇疆姣旇緝娓呮櫚鏄庝簡锛屽紩鐢ㄥ叿浣撶殑浜嬪姟绠$悊鍣紙濡傛灉浜嬪姟绠$悊鍣ㄥ悕绉颁负transactionManager锛岄偅涔堝彲浠ヤ笉闇€瑕佹槑纭紩鐢ㄤ簨鍔$鐞嗗櫒锛夛紝鐒跺悗閫氶厤绗﹀尮閰嶇壒瀹氭柟娉曪紝閰嶇疆鐗瑰畾浜嬪姟灞炴€э紱閰嶇疆瀹孉dvice锛屾帴涓嬫潵鏄皢Advice鍏宠仈鍒皃ointcut鐨勯厤缃紝濡備笅
<aop:config>
聽 聽 <aop:pointcut聽id="fooServiceOperation"聽expression="execution(* x.y.service.FooService.*(..))"/>
聽 聽 <aop:advisor聽advice-ref="txAdvice"聽pointcut-ref="fooServiceOperation"/>
</aop:config>
杩欓噷鐨勯厤缃瘮杈冪畝鍗曪紝涓嶅湪璧樿堪
鍏充簬浜嬪姟灞炴€х殑閰嶇疆锛屽彲閰嶇疆灞炴€у涓?/div>
灞炴€?/span>
|
鏄惁蹇呴』
|
榛樿鍊?/span>
|
鎻忚堪
|
name
|
鏄?/span>
|
聽
|
鏂规硶鍚嶏紝鍙€傜敤閫氶厤绗︼紙*锛?/span>
|
propagation
|
鍚?/span>
|
REQUIRED
|
浜嬪姟浼犳挱绛栫暐
|
isolation
|
鍚?/span>
|
DEFAULT
|
浜嬪姟闅旂绾у埆
|
timeout
|
鍚?/span>
|
-1锛堟棤闄愬埗锛?/span>
|
浜嬪姟瓒呮椂鏃堕棿
|
read-only
|
鍚?/span>
|
false
|
鏄惁鏄彧璇讳簨鍔?/span>
|
rollback-for
|
鍚?/span>
|
聽
|
浜嬪姟鍥炴粴鐨勫紓甯?/span>
|
no-rollback-for
|
鍚?/span>
|
聽
|
浜嬪姟涓嶅洖婊氱殑寮傚父
|
闄ゆ柟娉曞悕涔嬪锛屽叾浠栧睘鎬ч兘鏄彲閫夌殑锛屾牴鎹叿浣撶殑搴旂敤鍦烘櫙杩涜瀹氬埗锛屼簨鍔′紶鎾瓥鐣ュ畾涔変簡涓嶅悓浜嬪姟鐨勫瓨鍦ㄥ叧绯伙紝鍙€夊睘鎬у垪琛ㄥ涓嬶紙娉ㄦ剰Spring浜嬪姟姒傚康涓€昏緫浜嬪姟鍜岀墿鐞嗕簨鍔$殑鍖哄埆锛岀墿鐞嗕簨鍔″氨鏄寚鏁版嵁搴撳眰闈㈢殑浜嬪姟锛岃€岄€昏緫浜嬪姟鏄簲鐢ㄥ眰闈㈢殑锛屽彲浠ュ叿鏈夋洿涓板瘜鐨勮涓虹壒鎬э紝Spirng涓殑浜嬪姟灏辨槸鐗规寚閫昏緫浜嬪姟锛岃娉ㄦ剰锛?/div>
浼犳挱绛栫暐
|
鎻忚堪
|
REQUIRED
|
鏀寔褰撳墠涓婁笅鏂囦腑瀛樺湪浜嬪姟锛屽鏋滄病鏈変簨鍔″氨鍒涘缓涓€涓柊鐨勶紝濡傛灉鏈夛紝鍒欏湪褰撳墠浜嬪姟涓嬫墽琛?/span>
|
SUPPORTS
|
鏀寔褰撳墠涓婁笅鏂囦腑瀛樺湪浜嬪姟锛屽鏋滄病鏈変簨鍔★紝灏卞湪鏃犱簨鍔′笂涓嬫枃涓嬫墽琛?/span>
|
MANDATORY
|
鏀寔褰撳墠涓婁笅鏂囦腑瀛樺湪浜嬪姟锛屽鏋滄病鏈変簨鍔″氨鎶涘嚭寮傚父
|
REQUIRES_NEW
|
浜х敓涓€涓柊鐨勪簨鍔★紝濡傛灉褰撳墠涓婁笅鏂囦腑鏈変簨鍔″氨鎸傝捣鍘熸潵浜嬪姟
|
NOT_SUPPORTED
|
涓嶆敮鎸佸綋鍓嶄笂涓嬫枃瀛樺湪浜嬪姟锛屾€绘槸鍦ㄦ棤浜嬪姟涓婁笅鏂囦笅鎵ц锛屽瓨鍦ㄧ殑浜嬪姟浼氳繘琛屾寕璧锋搷浣?/span>
|
NEVER
|
涓嶆敮鎸佸綋鍓嶄笂涓嬫枃瀛樺湪浜嬪姟锛屽鏋滃瓨鍦ㄤ簨鍔″垯鎶涘嚭寮傚父
|
NESTED
|
濡傛灉褰撳墠涓婁笅鏂囦腑瀛樺湪浜嬪姟灏辨墽琛屼竴涓唴宓岀殑浜嬪姟
|
浜嬪姟闅旂绾у埆杩欎釜灞炴€ф槸鏁版嵁搴撳眰闈㈢殑锛屽彲閫夊睘鎬у垪琛ㄥ涓?/div>
浼犳挱绛栫暐
|
閬垮厤闂
|
涓嶈兘閬垮厤闂
|
READ_UNCOMMITTED
|
绗竴鏇存柊涓㈠け
|
鑴忚銆佷笉鍙噸澶嶈銆佸够璇?/span>
|
READ_COMMITTED
|
绗竴鏇存柊涓㈠け銆佽剰璇?/span>
|
涓嶅彲閲嶅璇汇€佸够璇?/span>
|
REPEATABLE_READ
|
绗竴鏇存柊涓㈠け銆佽剰璇汇€佷笉鍙噸澶嶈
|
骞昏
|
SERIALIZABLE
|
绗竴鏇存柊涓㈠け銆佽剰璇汇€佷笉鍙噸澶嶈銆佸够璇?/span>
|
聽
|
鍏蜂綋杩欎簺闂浠ュ強姣忎釜闅旂绾у埆鐨勫叿浣撶壒寰佹湁鏈轰細鍦ㄨ繘琛屽彊杩板惂锛屼笉鐒跺お澶氫簡锛岃繖閲屾敞鎰忎笉鍚岀殑鏁版嵁搴撳涓嶅悓闅旂绾у埆鏀寔鏄笉鍚岀殑锛屼緥濡侽racle鍙兘鏀寔璇绘彁浜ゅ拰搴忓垪鍖栵紝涓嶅彲閲嶅璇荤殑闂閫氳繃棰濆鐨勪箰瑙傞攣瀹炵幇锛屽叾涓瓨鍦ㄥ彧璇讳簨鍔★紝闅旂绾у埆瀹為檯鏄簭鍒楀寲锛屽湪閰嶇疆浜嬪姟鍙鏃惰娉ㄦ剰杩欓噷鐨勭壒鎬э紱Mysql鏀寔姣旇緝涓板瘜锛屼絾鍏跺彲閲嶅璇昏兘澶熻В鍐抽儴鍒嗗够璇婚棶棰橈紝杩欐槸涓庡叾瀹炵幇鏈夊叧鐨勶紝绛夋湁鏈轰細鎶婂畠灞曞紑鍙欒堪锛屼竴鑸簲鐢ㄥ満鏅笅璁剧疆璇绘彁浜ゅ氨鑳芥弧瓒宠姹傦紝璇绘湭鎻愪氦闅旂杩囦綆锛岃€屽叾浠栦袱涓殧绂荤骇鍒張澶噸閲忕骇锛屼娇鐢ㄧ殑璇濅細涓ラ噸闄嶄綆搴旂敤鎬ц兘锛屽浜庝竴浜涘苟鍙戦棶棰樼殑瀹瑰繊鎬э紝绗竴鏇存柊涓㈠け銆佽剰璇汇€佷笉鍙噸澶嶈锛堢壒娈婂満鏅负绗簩鏇存柊涓㈠け锛夋槸涓嶈兘瀹瑰繊鐨勶紝杩欓噷鍙互浣跨敤璇绘彁浜ら殧绂荤骇鍒?涔愯閿佹潵灞忚斀绗簩鏇存柊涓㈠け鐨勯棶棰橈紝杩欐槸涓€涓潈琛″満鏅渶瑕佸拰鎬ц兘鎯呭喌涓嬪仛鍑虹殑缁煎悎鎬ф柟妗堛€?/div>
浜嬪姟瓒呮椂璁剧疆鍙互鏍规嵁闇€瑕佽缃紝涓€鑸儏鍐典笅锛屼负浜嗛槻姝㈡暟鎹簱閿侀樆濉烇紝鎵€鏈夋柟娉曢兘搴旇鏈変簨鍔¤秴鏃舵椂闂淬€?/div>
鍙浜嬪姟璁剧疆娉ㄦ剰鍏舵€ц兘浼樺寲鐨勪环鍊硷紝涓€鑸儏鍐典笅锛屽彧璇绘搷浣滃彲鑳介兘涓嶉渶瑕佷簨鍔★紝杩欐椂鍊欓檷浣庝簨鍔¢殧绂荤骇鍒垨鑰呭共鑴嗕笉瑕佷簨鍔¢兘鑳藉鎻愬崌搴旂敤鎬ц兘銆?/div>
浜嬪姟寮傚父鍥炴粴锛屽叧浜庡彈妫€寮傚父鍜岄潪鍙楁寮傚父鐨勪簤璁鸿繖閲屽氨涓嶅湪璁鸿堪浜嗭紝Spring浜嬪姟閲囩敤浜咼TA鐨勬儻渚嬶紝榛樿鎯呭喌涓嬪彧鐢ㄨ繍琛屾椂寮傚父鍙婂叾瀛愮被浼氬鑷翠簨鍔″洖婊氾紝鍙楁寮傚父涓嶄細瀵艰嚧浜嬪姟鍥炴粴锛屽悗闈袱涓€夐」灏辨槸鍏充簬鍥炴粴涓庝笉鍥炴粴寮傚父璁剧疆鐨勶紝杩欓噷鍙互鏍规嵁闇€瑕佽繘琛岃缃€?/div>
聽
2.鍩轰簬@Transactional鐨勪簨鍔$鐞?/strong>
璇村畬浜嗗垏闈㈣缃殑浜嬪姟绠$悊锛岃繖閲岃涓€涓嬪熀浜嶡Transactional鐨勪簨鍔$鐞嗭紝鎴戜滑鐪嬩笅璇ユ敞瑙g殑涓€浜涘畾涔夛紝濡備笅

聽
閫氳繃涓婇潰鐨勫畾涔夛紝鎴戜滑鐭ラ亾杩欎釜娉ㄨВ鍙互鏀惧湪绫讳笂鍜岀壒瀹氭柟娉曪紙鍙兘涓簆ublic鏂规硶锛宲rotected銆乸rivate銆乸ackage-visible閮戒笉鍙互锛変笂锛屾斁鍦ㄧ被涓婄殑璇濓紝璇ョ被鎵€鏈夌殑public鏂规硶閮芥湁浜嗕簨鍔★紝鏀惧湪鐗瑰畾鏂规硶涓婂彲浠ュ畾鍒惰繖涓柟娉曟墽琛岀殑浜嬪姟灞炴€э紝涓轰簡鍚敤杩欑娉ㄨВ寮忕殑浜嬪姟绠$悊鏂瑰紡锛岄渶瑕佸湪xml涓坊鍔犲涓嬩俊鎭?/div>
<tx:annotation-driven transaction-manager="txManager"/>
杩欐椂鍊欏氨鍙互鎶婁箣鍓嶄簨鍔¢厤缃腑鍒囬潰鐨勯儴鍒嗗垹鎺変簡锛屽叧浜庤娉ㄨВ涓婄殑灞炴€э紝鍥犱负鍜屼笂闈㈠垏闈㈠舰寮忎腑绫讳技锛岃繖閲屽氨涓嶅湪璧樿堪浜?br style="">
涓婇潰鐨勯厤缃繕鏄熀浜嶺ML鐨勶紝杩欓噷缁欏嚭涓€涓畬鍏ㄥ熀浜庢敞瑙g殑瀹炰緥
娉ㄨВ閰嶇疆绫诲涓?/div>

聽
杩欓噷寮€鍚痓ean鎵弿锛屽紑鍚熀浜嶡Transactional鐨勪簨鍔$鐞?/div>
鍏朵腑鐨勪竴浜汢ean瀹氫箟锛孌ataSource

聽
SessionFactory

聽
TransactionManager

聽
鍦ㄥ垵濮嬪寲鐨勯儴鍒嗕娇鐢ˋnnotationConfigApplicationContext鍒濆鍖栧氨鍙互浜?/div>

聽
聽
缂栫▼寮忎簨鍔$鐞?/span>
聽
聽 聽 璇村畬浜嗗0鏄庡紡鐨勪簨鍔$鐞嗭紝鎺ヤ笅鏉ヨ璁茬紪绋嬪紡浜嬪姟绠$悊锛孲pring鎻愪緵浜嗕袱绉嶇紪绋嬫柟寮忥紝涓€绉嶆槸浣跨敤TransactionTemplate锛屼竴绉嶆槸鐩存帴浣跨敤鍏蜂綋PlatformTransactionManager锛屽畼鏂规帹鑽愮涓€绉嶆柟寮忥紝鎺ヤ笅鏉ユ垜浠垎鍒繘琛屽彊杩般€?/div>
1. 浣跨敤TransactionTemplate
TransactionTemplate閲囩敤涓€绉嶅洖璋冪殑鏂瑰紡灏嗚鎵ц鏂规硶鍖呭惈鍦ㄤ簨鍔′腑锛屽叾鍒濆鍖栭渶瑕佹寚瀹氱壒瀹氱殑浜嬪姟绠$悊鍣紝瀹為檯浣跨敤浠g爜鐗囨濡備笅
transactionTemplate.execute(new聽TransactionCallback() {
聽 聽 // the code in this method executes in a transactional context
聽 聽 public聽Object doInTransaction(TransactionStatus status) {
聽 聽 聽 聽 updateOperation1();
聽 聽 聽 聽 return聽resultOfUpdateOperation2();
聽 聽 }
})
涓婁緥鏄湁杩斿洖缁撴灉鐨勶紝鍙互涓嶉渶瑕佽繑鍥炵粨鏋滐紝濡備笅
transactionTemplate.execute(new聽TransactionCallbackWithoutResult() {
聽 聽 protected void聽doInTransactionWithoutResult(TransactionStatus status) {
聽 聽 聽 聽 updateOperation1();
聽 聽 聽 聽 updateOperation2();
聽 聽 }
})
鍙互鍦ㄦ柟娉曚綋鍐呭洖婊氫簨鍔★紝璁剧疆status.setRollbackOnly()鍗冲彲
TransactionTemplate鎻愪緵浜嗕竴浜涗簨鍔″睘鎬ц缃帴鍙o紝鍙互鏍规嵁闇€瑕佽繘琛岃缃€?/div>
2.浣跨敤PlatformTransactionManager
杩欎釜姣旇緝绠€鍗曪紝鍏抽敭鏄畾涔塗ransactionDefinition锛屼唬鐮佸涓?/div>
DefaultTransactionDefinition def =聽new聽DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try聽{
聽 聽 // execute your business logic here
}
catch聽(MyException ex) {
聽 聽 txManager.rollback(status);
聽 聽 throw聽ex;
}
txManager.commit(status);
浠g爜寰堟竻鏅版槑浜嗭紝杩欓噷灏变笉鍦ㄨ禈杩颁簡銆?/div>
聽
鍐欎笉涓嬪幓浜嗭紝绠楁槸鍋氫簡涓€娆℃⒊鐞嗗惂锛屾湁鏃堕棿鍦ㄨ繘琛岃缁嗗彊杩般€?/div>
聽