Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒

Spring鐮旂┒绗旇------浜嬪姟鎺㈢┒

聽 聽 鏈€杩戠湅浜嗘瘮杈冨Spring鐨勪笢瑗匡紝鑴戜腑姒傚康鐭ヨ瘑姣旇緝鏉備贡锛屽€熷姪鍛ㄥ叚鍛ㄥぉ鐨勯棽鏆囨椂闂达紝鍐欎竴浜涘唴瀹癸紝姊崇悊涓€涓嬭嚜宸辫剳涓殑姒傚康锛屼篃浠ユ浣滀负璁板綍锛屽笇鏈涜嚜宸变互鍚庤兘澶熸柟渚挎煡闃咃紝涔熷笇鏈涜兘澶熷鍚勪綅鐪嬪畼鏈夋墍甯姪銆?/span>

聽 聽 绗竴涓猄pring鐩稿叧涓婚鏄疭pring鐨勪簨鍔$鐞嗭紝鍊熷姪瀹樻柟鏂囨。鐨勪竴鍙ヨ瘽锛孲pring鎻愪緵浜嗕竴鑷寸殑浜嬬墿绠$悊鎶借薄妯″瀷锛岃兘澶熻澶у鍦ㄤ笉鍚岀殑浜嬪姟API锛圝TA銆丣DBC銆丠ibernate銆丣PA銆丣DO绛夛級涔嬮棿鏈変竴鑷寸殑缂栫▼浣撻獙锛孲pring鎻愪緵浜嗗0鏄庡紡浜嬪姟绠$悊鍜岀紪绋嬩簨鍔$鐞嗕袱绉嶄簨鍔$鐞嗘柟寮忥紝鍓嶈€呭€熼壌浜咵JB CMT涓簨鍔$鐞嗘柟寮忥紝鍚庤€呭垯绠€鍖栦簡JTA鐨勪簨鍔″紓甯哥紪绋嬫ā鍨嬶紝浠庤繖涓搴︽潵鐪嬶紝Spring浜嬪姟鎻愪緵浜嗗叏闈㈢畝娲佺殑涓€鑷存€т簨鍔$鐞嗘柟妗堛€?/div>
聽 聽 鐔熸倝Java EE缂栫▼鐨勪汉搴旇鐭ラ亾锛屼簨鍔″垎涓哄叏灞€锛坓lobal锛夊拰鏈湴锛坙ocal锛変袱绉嶄簨鍔★紱鍏ㄥ眬浜嬪姟鎻愪緵浜嗗湪澶氫釜浜嬪姟婧愪箣闂存搷浣滀繚璇佸師瀛愭€х殑鑳藉姏锛屽吀鍨嬬殑浜嬪姟婧愭槸鏁版嵁搴擄紝鍦ㄤ竴浜涗紒涓氶泦鎴愰鍩熻繕鍖呮嫭MQ绛変腑闂翠欢锛屽湪Java EE浣撶郴涓€氳繃JTA鏉ュ鍏ㄥ眬浜嬪姟鎻愪緵鏀寔锛屼簨鍔$鐞嗗姛鑳界敱搴旂敤鏈嶅姟鍣ㄦ彁渚涙敮鎸侊紝鍦ㄥ疄闄呮搷浣滄椂闇€瑕侀€氳繃JNDI杩涜浜嬪姟瀵硅薄鐨勫紩鐢紝杩欏氨瀛樺湪涓ょ鑰﹀悎缁戝畾锛岀壒瀹氭煡鎵惧崗璁拰鐗瑰畾搴旂敤瀹瑰櫒缁戝畾锛岃繖鏄笉鏄笉鑹殑缁勭粐褰㈠紡瑕佺湅搴旂敤鐨勯渶姹傦紝浣嗗湪澶у鏁版椂鍊欙紝澶у鏁板簲鐢ㄤ负浜嗚幏鍙栧叏灞€浜嬪姟鐨勮兘鍔涜€屼粯鍑鸿繖绉嶈€﹀悎鐨勪唬浠烽兘鏄瘮杈冧笉鍚堢畻鐨勶紱鏈湴浜嬪姟鏄祫婧愮壒瀹氱殑锛屼緥濡備娇鐢↗DBC connection杩涜鐨勪簨鍔℃搷浣滐紝鏈湴浜嬪姟涓殑浜嬬墿绠$悊鍔熻兘鏄簲鐢ㄧ▼搴忚繘琛屾帶鍒剁殑锛岄潪瀹瑰櫒鎵樼锛屽洜姝ゅ叾鑳芥憜鑴卞鍣ㄧ粦瀹氱殑鍓綔鐢紝浣嗗叾灞€闄愭€т篃寰堟槑鏄撅紝鍥犱负鏄祫婧愮壒瀹氱殑锛屽叾涓嶈兘鏀寔璺ㄤ簨鍔℃簮鐨勬搷浣滐紝鎵€骞告垜浠ぇ閮ㄥ垎搴旂敤閮芥病鏈夎法浜嬪姟婧愮殑闇€姹傦紝鏈湴浜嬪姟鍦ㄨ繖绉嶆儏鍐典笅姣旇緝閫傜敤锛涘叧浜庡叏灞€浜嬪姟杩欓噷澶氳ˉ鍏呬竴鐐癸紝鍥犱负鍒嗗竷寮忎簨鍔℃湰韬殑澶嶆潅鎬э紝鍏舵瘮杈冮噸閲忕骇锛岃€冭檻鐨勪簨鍔℃ā鍨嬪彲鑳戒篃姣旇緝澶嶆潅锛岄櫎闈炲繀椤讳娇鐢紝鍚﹀垯杩樻槸鏁€岃繙涔嬩负濂斤紝鍗充娇鍥犱负姘村钩鎵╁睍銆侀珮鍙敤銆佽礋杞藉潎琛$瓑闇€姹傝€岄渶瑕佹坊缃澶栫殑浜嬪姟婧愶紝涔熷簲璇ュ敖閲忛伩鍏嶏紝渚嬪浣跨敤Oracle RAC锛屽皢鍒嗗竷寮忎簨鍔$殑澶嶆潅鎬у皝瑁呭湪鏁版嵁搴撲骇鍝佸眰闈紝绠€鍖栧簲鐢ㄧ骇鍒殑浜嬪姟鎿嶄綔锛涘疄闄呬笂锛屽叏灞€浜嬪姟鎿嶄綔涓嶄竴瀹氶潪闇€瑕佺粦瀹氬簲鐢ㄥ鍣紝鍊熷姪鐙珛鐨勪簨鍔$鐞嗗櫒濡?span style="color: #0000ff; font-size: 10pt; background-color: inherit;">Atomikos Transactions聽鍜?span style="font-size: 10pt; background-color: inherit;">聽JOTM涔熻兘鎻愪緵JTA鍏ㄥ眬浜嬪姟鐨勫姛鑳斤紝褰撶劧锛岃繕鏄涓婃墍杩帮紝骞朵笉鎺ㄨ崘浣跨敤銆?br style="">
聽 聽 Spring鎻愪緵浜嗕竴鑷寸殑浜嬪姟鎶借薄锛岃€岃繖鎶借薄鐨勬牳蹇冨氨鏄疨latformTransactionManager鎺ュ彛锛屾帴鍙e畾涔夊涓?/span>
聽 聽聽Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
璇ユ帴鍙f湁涓変釜鏂规硶锛岀涓€涓柟娉曟牴鎹甌ransationDefinition瀵硅薄鑾峰彇浜嬪姟锛圱ransactionStatus锛夛紝TransationDefinition涔熸槸涓€涓帴鍙o紝瀹氫箟濡備笅
聽 聽 聽Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
閫氳繃杩欎釜瀹氫箟锛屾垜浠煡閬?span style="font-size: small;">TransationDefinition鎻愪緵浜嗕簨鍔′紶鎾瓥鐣ヤ互鍙婁簨鍔¢殧绂荤骇鍒殑甯搁噺瀹氫箟锛屽悓鏃舵彁渚涗簡榛樿闅旂鍜岄粯璁や簨鍔¤秴鏃剁殑甯搁噺瀹氫箟锛屾柟娉曚笂鎻愪緵浜嗚幏鍙栦簨鍔¢殧绂荤骇鍒€佷簨鍔′紶鎾瓥鐣ャ€佷簨鍔¤秴鏃舵椂闂淬€佹槸鍚﹀彧璇讳簨鍔′互鍙婁簨鍔″悕绉颁俊鎭紝鍩烘湰涓婁簨鍔$殑鍩烘湰姒傚康閮藉寘鍚湪浜嗚繖涓帴鍙e畾涔変腑锛汿ransactionStatus鎻愪緵浜嗙畝鍗曠殑鎺у埗浜嬪姟浠ュ強鏌ヨ浜嬪姟鐘舵€佺殑鏂规硶锛屽畾涔夊涓?/span>

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
鍥犱负鎺ュ彛瀹氫箟姣旇緝鏄庝簡锛岃繖閲屼笉鍐嶅睍寮€璧樿堪锛?span style="font-size: 13px;">PlatformTransactionManager鎺ュ彛鏄疭pring浜嬪姟绠$悊鐨勬牳蹇冿紝鍏剁被绾х粨鏋勫涓?/span>

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
閫氳繃涓婇潰鐨勭粨鏋勫浘锛屾垜浠湅鍒癝pring涓烘瘡涓€绉嶅父鐢ㄧ殑鍏蜂綋鐨勪簨鍔℃搷浣淎PI鎻愪緵浜嗗叿浣撶殑瀹炵幇锛屼緥濡傛垜浠父鐢ㄧ殑鍩轰簬绾疛DBC鐨凞ataSourceTransactionManager鍜屽父鐢∣RM hibernate鐨凥ibernateTransactionManager锛孞TA API鐗逛緵浜嗛€氱敤鐨勫疄鐜颁互鍙婇拡瀵筗eblogic銆乄ebSphere搴旂敤鏈嶅姟鍣ㄦ彁渚涚殑鐗瑰畾瀹炵幇锛?span style="font-size: 13px;">PlatformTransactionManager瀹氫箟浜嗗熀鏈殑浜嬪姟鎿嶄綔妯″瀷锛岃€孉bstractPlatformTransactionManager鎶借薄绫诲疄鐜颁簡璇ユ帴鍙o紝璇ユ娊璞$被瀹氫箟浜嗕竴浜涙墍鏈夊叿浣撳疄鐜扮被鍏辨湁鐨勫睘鎬у拰鏂规硶锛屽悓鏃跺畾涔変簡缁熶竴鐨勪簨鍔″鐞嗘祦绋嬶紝杩欐槸璁捐妯″紡妯℃澘妯″紡闈炲父缁忓吀鐨勫簲鐢紝鍥犱负璇ョ被鏂规硶瀹氫箟杈冨锛岃繖閲屾垜浠氨涓嶅湪璐村嚭璇ョ被鐨勫畾涔夛紝鎴戜滑鏉ョ湅鐪嬭绫诲浣曞畾涔変簡缁熶竴鐨勪簨鍔″鐞嗘祦绋嬶紝璇ョ被瀹炵幇浜哖latformTransactionManager鎺ュ彛鐨刢ommit鏂规硶锛屽悓鏃跺皢璇ユ柟娉曡涓篺inal锛屼娇鍏跺瓙绫讳笉鑳藉閲嶅啓锛宑ommit鏂规硶濡備笅锛?/span>

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
璇ユ柟娉曞畾涔変簡鍩烘湰鐨勬彁浜ゅ鐞嗭紝鎴戜滑鐪嬪埌瀹為檯澶勭悊鏄痯rocessXXX绛夋柟娉曪紝processCommit閮ㄥ垎浠g爜濡備笅

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
鎴戜滑鐪嬪埌杩欎釜鏂规硶璐熻矗浜嗗叿浣撲簨鍔℃彁浜ょ殑鐩稿叧鎿嶄綔锛屾渶鍚庡疄闄呮彁浜ゆ搷浣滄槸doCommit锛岃€宒oCommit涓轰竴涓娊璞℃柟娉曪紝杩欏氨鏄绫荤粰瀛愮被瀹炵幇鐣欎笅鐨勨€滈挬瀛愨€濓紝鍏蜂綋鐨勬彁浜ゆ搷浣滅敱瀛愮被鏉ュ幓瀹炵幇锛岃繖鏄竴涓吀鍨嬬殑妯℃澘妯″紡搴旂敤锛屾帴涓嬫潵鎴戜滑鎵句竴涓叿浣撳瓙绫绘潵鐪嬬湅doCommit鐨勫疄闄呮搷浣滐紝鎴戜滑鐪嬬湅姣旇緝鐔熸倝鐨凥ibernateTransactionManager锛宒oCommit濡備笅锛?/div>

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
寰堟槑鏄撅紝鐪嬪埌浜咹ibernate浜嬪姟鎿嶄綔鍏稿瀷鐨勭敤娉曪紝鍏朵粬瀹炵幇绫讳技锛岃繖閲屾垜浠笉鍦ㄨ禈杩帮紝澶у鍙互鑷繁鐪嬬湅銆?/div>
聽 聽 聽 聽 鍏充簬鍏蜂綋鐨凷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>

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
鍏朵腑鐨凙OP proxy锛孲pring瀹氫箟浜員ransactionInterceptor绫伙紝璇ョ被缁撴瀯濡備笅

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
閫氳繃杩欎釜缁撴瀯锛屾垜浠湅鍒板疄闄呯殑鏂规硶閮藉湪TransactionInterceptor鐨勭埗绫籘ransactionAspectSupport涓紝TransactionInterceptor鐨勫叧閿柟娉曟槸invoke鏂规硶锛岃€岃繖涓柟娉曞唴閮ㄨ皟鐢ㄤ簡鐖剁被鐨刬nvokeWithinTransaction鏂规硶锛岃繖鏄繖閲屼簨鍔″鐞嗙殑鏍稿績锛宨nvokeWithinTransaction鏂规硶鐗囨濡備笅

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
杩欑湅璧锋潵鏄竴涓吀鍨嬬殑鍒囬潰浠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殑涓€浜涘畾涔夛紝濡備笅

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

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
杩欓噷寮€鍚痓ean鎵弿锛屽紑鍚熀浜嶡Transactional鐨勪簨鍔$鐞?/div>
鍏朵腑鐨勪竴浜汢ean瀹氫箟锛孌ataSource

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
SessionFactory

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
TransactionManager

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
鍦ㄥ垵濮嬪寲鐨勯儴鍒嗕娇鐢ˋnnotationConfigApplicationContext鍒濆鍖栧氨鍙互浜?/div>

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
缂栫▼寮忎簨鍔$鐞?/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>

1 妤? diannaoxiaotong 2015-10-12  
璧炰竴涓?img src="/images/smiles/icon_biggrin.gif" />
2 妤? cczzyc 2015-10-12  
璧?nbsp; 杩樻槸鏈変簺甯姪鐨?/div>
3 妤? sswh 2015-10-12  
闈炲父涓嶉敊锛?/div>
4 妤? fisher123 2015-10-12  
鎸哄ソSpring鐮旂┒绗旇-浜嬪姟鎺㈢┒
5 妤? bonait 2015-10-12  
涓嶉敊锛屽€煎緱瀛︿範锛寃ww.zipin168.com
6 妤? u014689192 2015-10-12  
瀛︿範浜?img src="/images/smiles/icon_biggrin.gif" />
7 妤? cywhoyi 2015-10-12  
鏇村簳灞傛洿澶氫笌JNDI JTA 姣忎釜鍘傚晢鍦ㄥ埗瀹氫簨鍔℃帶鍒舵柟闈㈤兘鏈夊疄鐜癤A鐨勬帴鍙o紝spring鍙槸灏佽涓€濂楄€屽凡锛屽湪鍏朵笂闈OP鎷︽埅妞嶅叆鐨勪唬鐞嗙被鏉ヤ繚璇?/div>
8 妤? clannadyue 鍓嶅ぉ  
cywhoyi 鍐欓亾
鏇村簳灞傛洿澶氫笌JNDI JTA 姣忎釜鍘傚晢鍦ㄥ埗瀹氫簨鍔℃帶鍒舵柟闈㈤兘鏈夊疄鐜癤A鐨勬帴鍙o紝spring鍙槸灏佽涓€濂楄€屽凡锛屽湪鍏朵笂闈OP鎷︽埅妞嶅叆鐨勪唬鐞嗙被鏉ヤ繚璇?/div>
褰撶劧锛孲pring鐨勪环鍊煎氨鍦ㄤ簬鎻愪緵浜嗕竴鑷存€х殑灏佽
9 妤? clannadyue 鍓嶅ぉ  
fisher123 鍐欓亾
鎸哄ソSpring鐮旂┒绗旇-浜嬪姟鎺㈢┒

璋㈣阿
10 妤? clannadyue 鏄ㄥぉ  
bonait 鍐欓亾
涓嶉敊锛屽€煎緱瀛︿範锛寃ww.zipin168.com

璋㈣阿

文章评论

Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
10个调试和排错的小建议
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员最害怕的5件事 你中招了吗?
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
那些性感的让人尖叫的程序员
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
每天工作4小时的程序员
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Google伦敦新总部 犹如星级庄园
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
10个帮程序员减压放松的网站
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Web开发者需具备的8个好习惯
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
不懂技术不要对懂技术的人说这很容易实现
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员都该阅读的书
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员和编码员之间的区别
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
一个程序员的时间管理
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
如何区分一个程序员是“老手“还是“新手“?
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
2013年中国软件开发者薪资调查报告
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
做程序猿的老婆应该注意的一些事情
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Java程序员必看电影
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Web开发人员为什么越来越懒了?
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
什么才是优秀的用户界面设计
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
十大编程算法助程序员走上高手之路
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
团队中“技术大拿”并非越多越好
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
如何成为一名黑客
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员的一天:一寸光阴一寸金
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员眼里IE浏览器是什么样的
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序猿的崛起——Growth Hacker
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
2013年美国开发者薪资调查报告
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
我跳槽是因为他们的显示器更大
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员的样子
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
亲爱的项目经理,我恨你
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
为啥Android手机总会越用越慢?
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
总结2014中国互联网十大段子
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
Java 与 .NET 的平台发展之争
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
老程序员的下场
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
为什么程序员都是夜猫子
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
中美印日四国程序员比较
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
漫画:程序员的工作
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
编程语言是女人
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
老美怎么看待阿里赴美上市
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
聊聊HTTPS和SSL/TLS协议
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
旅行,写作,编程
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
写给自己也写给你 自己到底该何去何从
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
初级 vs 高级开发者 哪个性价比更高?
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
科技史上最臭名昭著的13大罪犯
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
我是如何打败拖延症的
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
我的丈夫是个程序员
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
要嫁就嫁程序猿—钱多话少死的早
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
60个开发者不容错过的免费资源库
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
5款最佳正则表达式编辑调试器
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
程序员周末都喜欢做什么?
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
代码女神横空出世
Spring鐮旂┒绗旇-浜嬪姟鎺㈢┒
当下全球最炙手可热的八位少年创业者
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有