spring浜嬪姟綆$悊
鍦ㄥ涔?/span>spring浜嬪姟綆$悊鏃?/span>,鎴戝繊涓嶄綇瑕侀棶,spring涓轟粈涔堣繘琛屼簨鍔$鐞?/span>,spring鎬庝箞榪涜鐨勪簨鍔$鐞?/span>?
鎺ヤ笅鏉ヨ璇?/span>spring鏄€庢牱榪涜浜嬪姟綆$悊鐨?/span>.
鈶?/span> Spring浜嬪姟絳栫暐
Spring浜嬪姟絳栫暐,涔熷氨鏄?/span>spring浜嬪姟綆$悊鐨勫疄鐜版柟寮?/span>.瀹冩湁涓€涓粺涓€鐨勬娊璞℃槸鐢卞疄鐜頒笅闈㈣繖涓帴鍙e畬鎴愮殑.
org.springframework.transaction.PlatformTransactionManager
姝ゆ帴鍙g殑鍐呭濡備笅:

Public interface PlatformTransactionManager{
TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;
Void commit(TransactionStatus status) throws TransactionException;
Void rollback(TransactionStatus status) throws TransactionException;
}

涓嶇鏄0鏄庡紡鐨勮繕鏄紪紼嬪紡鐨勪簨鍔$鐞嗛兘闇€瑕佹鎶借薄鏉ュ畬鎴?/span>.
瑙i噴涓€涓嬭繖涓帴鍙?/span>,榪欐牱鍙互鏇村ソ鐨勭悊瑙?/span>spring鐨勪簨鍔℃帶鍒剁殑鍘熺悊.
getTransaction()鏍規(guī)嵁綾誨瀷涓?/span>TransactionDefinition鐨勫弬鏁拌繑鍥炰竴涓?/span>TransactionStatus瀵硅薄.榪斿洖鐨?/span>TransactionStatus瀵硅薄鍙兘浠h〃涓€涓柊鐨勬垨宸茬粡瀛樺湪鐨勪簨鍔?/span>(濡傛灉鍦ㄥ綋鍓嶈皟鐢ㄥ爢鏍堟湁涓€涓鍚堟潯浠剁殑浜嬪姟).濡傚悓J2EE浜嬪姟涓婁笅鏂?/span>,涓€涓?/span>TransactionStatus涔熸槸鍜屾墽琛岀殑綰跨▼鍏寵仈鐨?/span>.
鍚屾椂,鍦ㄦ鏋朵腑榪樺瓨鍦?/span>TransactionDefinition鎺ュ彛,鍗充笂杈圭殑鍙傛暟綾誨瀷.姝ゆ帴鍙f寚瀹氫簡浜嬪姟闅旂紼嬪害銆佷簨鍔′紶鎾€佷簨鍔¤秴鏃躲€佸彧璇葷姸鎬併€?/span>
鍙﹀錛岃繕鏈?/span>TransactionStatus鎺ュ彛銆傝繖涓帴鍙d負(fù)澶勭悊浜嬪姟鎻愪緵綆€鍗曠殑鎺у埗浜嬪姟鎵ц鍜屾煡璇簨鍔$姸鎬佺殑鏂規(guī)硶銆?/span>
鈶?/span> 涓ょ浜嬪姟綆$悊鏂瑰紡錛氱紪紼嬪紡銆佸0鏄庡紡銆?/span>
Spring鎻愪緵涓ょ鏂瑰紡鐨勭紪紼嬪紡浜嬪姟綆$悊錛屽垎鍒槸錛氫嬌鐢?/span>TransactionTemplate鍜岀洿鎺ヤ嬌鐢?/span>PlatformTransactionManager銆?/span>
鈪? TransactionTempale閲囩敤鍜屽叾浠朣pring妯℃澘錛屽JdbcTempalte鍜孒ibernateTemplate涓€鏍風(fēng)殑鏂規(guī)硶銆傚畠浣跨敤鍥炶皟鏂規(guī)硶錛屾妸搴旂敤紼嬪簭浠庡鐞嗗彇寰楀拰閲婃斁璧勬簮涓В鑴卞嚭鏉ャ€傚鍚屽叾浠栨ā鏉匡紝TransactionTemplate鏄嚎紼嬪畨鍏ㄧ殑銆?/span>
浠g爜鐗囨錛?/span>

Object result = tt.execute(new TransactionCallback()...{

public Object doTransaction(TransactionStatus status)...{
updateOperation();
return resultOfUpdateOperation();
}
});

浣跨敤TransactionCallback()鍙互榪斿洖涓€涓€箋€?/span>
濡傛灉浣跨敤TransactionCallbackWithoutResult鍒欐病鏈夎繑鍥炲€箋€?/span>
鈪?/span>. 涔熷彲浠ヤ嬌鐢?/span>PlatformTransactionManager鐩存帴綆$悊浜嬪姟銆傜畝鍗曞湴閫氳繃涓€涓?/span>bean寮曠敤緇欎綘鐨?/span>bean浼犻€掍竴涓綘浣跨敤鐨?/span>PlatformTransaction瀵硅薄銆傜劧鍚庯紝浣跨敤TransactionDefinition鍜?/span>TransactionStatus瀵硅薄灝卞彲浠ュ彂璧楓€佸洖婊氥€佹彁浜や簨鍔°€?/span>
濡備笅鐗囨錛?/span>
DefaultTransactionDefinition def= new DefaultTransactionDefinition(); //new 涓€涓簨鍔?/span>
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //鍒濆鍖栦簨鍔?鍙傛暟瀹氫箟浜嬪姟鐨勪紶鎾被鍨?
TransactionStatus status = transactionManager.getTransaction(def); //鑾峰緱浜嬪姟鐘舵€?/span>

try...{
……………..
transactionManager.commit(status); //鎻愪氦浜嬪姟;

}catch(…..)...{
transactionManager.rollback(status); //鍥炴粴浜嬪姟;
}

Spring涔熸彁渚涘0鏄庡紡浜嬪姟綆$悊銆傝繖鏄€氳繃AOP瀹炵幇鐨勩€?/span>
澶у鏁?/span>Spring鐢ㄦ埛閫夋嫨澹版槑寮忎簨鍔$鐞嗭紝榪欐槸鏈€灝戝獎鍝嶅簲鐢ㄤ唬鐮佺殑閫夋嫨錛屽洜鑰岃繖鏄拰闈炰鏡鍏ユ€х殑杞婚噺綰у鍣ㄧ殑瑙傚康鏄竴鑷寸殑銆?/span>
鈶?/span> 閫氬父閫氳繃TransactionProxyFactoryBean璁劇疆Spring浜嬪姟浠g悊銆傞渶瑕佷竴涓洰鏍囧璞″寘瑁呭湪浜嬪姟浠g悊涓€傝繖涓洰鏍囧璞′竴鑸槸涓€涓櫘閫?/span>Javabean銆傚綋鎴戜滑瀹氫箟TransactionProxyFactoryBean鏃訛紝蹇呴』鎻愪緵涓€涓浉鍏崇殑PlatformTransactionManager鐨勫紩鐢ㄥ拰浜嬪姟灞炴€с€備簨鍔″睘鎬у惈鏈変簨鍔″畾涔夈€備緥濡?/span>:
<bean id="transactionService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="transactionServiceControl"/>
</property>
<property name="transactionAttributes">
<props>
<prop key=”insert*”>PROPAGATION_REQUIRED,-MyCheckedException</prop>
<prop key=”update*”>PROPAGATION_REQUIRED</prop>
<prop key=”*”>PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

浜嬪姟浠g悊浼?xì)瀹炵幇鐩爣瀵硅薄鐨勬帴鍙?榪欓噷鏄睘鎬у悕鏄痶arget鐨勫紩鐢ㄣ€俰d鏄痶ransactionServiceControl銆傦紙鈼忎嬌鐢跡錛э棘錛╋饑涔熷彲浠ュ疄鐜板叿浣撶被鐨勪唬鐞嗐€傚彧瑕佽緗畃roxyTargetClass灞炴€т負(fù)true鍗沖彲銆傚鏋滅洰鏍囧璞℃病鏈夊疄鐜頒換浣曟帴鍙o紝榪欏皢鑷姩璁劇疆璇ュ睘鎬т負(fù)true銆傞€氬父錛屾垜浠笇鏈涢潰鍚戞帴鍙g紪紼嬨€傦級 鈼忎嬌鐢╬roxyInterfaces灞炴€ф潵闄愬畾浜嬪姟浠g悊鏉ヤ唬鐞嗘寚瀹氭帴鍙d篃鏄彲浠ャ€?鈼忎篃鍙互閫氳繃浠巓rg.springframework.aop.framework.ProxyConfig緇ф壙鎴栨墍鏈堿OP浠g悊宸ュ巶鍏變韓鐨勫睘鎬ф潵瀹氬埗TransactionProxyFactoryBean琛屼負(fù)銆?/span>
鐒跺悗錛岃璇村睘鎬у悕鏄?/span>transactionAttributes鎰忎箟錛?/span>
榪欓噷鐨則ransactionAttributes灞炴€ф槸瀹氫箟鍦╫rg.springframework.transaction.interceptor.NameMathTransactionAttributeSource涓殑灞炴€ф牸寮忚緗€傝繖涓寘鎷€氶厤絎︾殑鏂規(guī)硶鍚嶇О鏄犲皠鏄緢鐩磋鐨勶紝濡?#8221;insert*”銆傛敞鎰廼nsert*鐨勬槧灝勭殑鍊煎寘鎷洖婊氳鍒欍€?#8221;-MyCheckException”鎸囧畾濡傛灉鏂規(guī)硶鎶涘嚭MyCheckException鎴栧畠鐨勫瓙綾伙紝浜嬪姟浼?xì)鑷姩鍥炴粴銆傚彲浠ョ敤閫楀彿鍒嗛殧澶氫釜鍥炴粴瑙勫垯銆?#8220;錛?#8221;鍓嶇紑寮哄埗鍥炴粴錛?#8220;錛?#8221;鍓嶇紑鎸囧畾鎻愪氦錛堣繖鍏佽鍗充嬌鎶涘嚭unchecked寮傚父鏃朵篃鍙互鎻愪氦浜嬪姟錛夈€?#8220;PROPAGATION_REQUIRED”鎸囧畾浜嬪姟浼犳挱鑼冨洿銆?/span>
TransactionProxyFactoryBean鍏佽浣犻€氳繃“preInterceptors”鍜?#8220;postInterceptors”灞炴€ц緗墠鎴栧悗鐨勬嫤鎴搷浣溿€傚彲浠ヨ緗換鎰忔暟閲忕殑鍓嶅拰鍚庨€氳繃錛屽畠浠殑綾誨瀷鍙互鏄肌dvistor錛堝垏鍏ョ偣錛夛紝MethodInterceptor鎴栬褰撳墠Spring閰嶇疆鏀寔鐨勯€氱煡綾誨瀷銆備緥濡傦細(xì)錛磆rowAdvice錛孉fterReturningAdvice鎴栵饑eforeAdvice銆傝繖浜涢€氱煡蹇呴』鏀寔瀹炰緥鍏變韓妯″紡銆傚鏋滀綘闇€瑕侀珮綰錛及鐗規(guī)€ф搷浣滀簨鍔★紝閫氳繃org.springframework.aop.framework.ProxyFactoryBean錛岃€屼笉鏄疶ransactionProxyFactory瀹炵敤浠g悊鍒涘緩鑰呫€?/span>
鈶?span> 鍙︿竴縐嶅0鏄庢柟寮忥細(xì)BeanNameAutoProxyCreator
浣跨敤TransactionProxyFactoryBean褰撲簨鍔′唬鐞嗗寘瑁呭璞★紝浣犲彲浠ュ畬鍏ㄦ帶鍒朵唬鐞嗐€傚鏋滈渶瑕佺敤涓€鑷存柟寮忓寘瑁呭ぇ閲廱ean銆備嬌鐢ㄤ竴涓狟eanFactoryPostProcessor鐨勪竴涓疄鐜幫紝BeanNameAutoProxyCreator錛屽彲浠ユ彁渚涘彟澶栦竴縐嶆柟娉曘€?Spring涓紝涓€鏃pplicationContext璇誨畬瀹冪殑鍒濆鍖栦俊鎭紝瀹冨皢鍒濆鍖栨墍鏈夊疄鐜癇eanPostProcessor鎺ュ彛鐨刡ean錛屽茍涓旇瀹冧滑鍚庡鐞咥pplicationContext涓墍鏈夊叾浠栫殑bean銆傛墍浠ヤ嬌鐢ㄨ繖縐嶆満鍒訛紝姝g‘閰嶇疆鐨凚eanNameAutoProxyCreator鍙互鐢ㄦ潵鍚庡鐞嗘墍鏈堿pplicationContext涓墍鏈夊叾浠栫殑bean),騫朵笖鎶婂畠浠敤浜嬪姟浠g悊鍖呰璧鋒潵銆傜湡姝g敓鎴愮殑浜嬪姟浠g悊鍜屼嬌鐢═ransactionProxyFactoryBean鐢熸垚鐨勫熀鏈竴鑷淬€?/span>
鏈€鍚庯紝鎬葷粨涓€涓婼pring鐨勪紭鐐癸細(xì)
鈽?span style="font: 7pt 'Times New Roman'"> 涓轟笉鍚岀殑浜嬪姟錛★及錛╂彁渚涗竴鑷寸殑緙栫▼妯″瀷錛屽JTA銆丣DBC銆丠ibernate銆乮BATIS鏁版嵁搴撳眰錛激錛?/span>
鈽?span style="font: 7pt 'Times New Roman'"> 鎻愪緵姣斿ぇ澶氭暟浜嬪姟API鏇寸畝鍗曠殑銆佹槗浜庝嬌鐢ㄧ殑緙栫▼寮忎簨鍔$鐞咥PI
鈽?span style="font: 7pt 'Times New Roman'"> 鏁村悎Spring鏁版嵁璁塊棶鎶借薄
鈽?span style="font: 7pt 'Times New Roman'"> 鏀寔Spring澹版槑寮忎簨鍔$鐞?/span>

]]>