日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring是如何管理 事务的

發(fā)布時間:2023/12/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring是如何管理 事务的 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


Spring提供的事務(wù)管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復(fù)的代碼比較多;聲明式的比編程式的更靈活方便。?

  1、傳統(tǒng)使用JDBC的事務(wù)管理?

  以往使用JDBC進(jìn)行數(shù)據(jù)操作,使用DataSource,從數(shù)據(jù)源中得到Connection,我們知道數(shù)據(jù)源是線程安全的,而連接不是線程安全的,所以對每個請求都是從數(shù)據(jù)源中重新取出一個連接。一般的數(shù)據(jù)源由容器進(jìn)行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等這些J2EE商業(yè)容器都提供了這個功能。?

  以往的我們使用JDBC在寫代碼時,事務(wù)管理可能會是這樣:?

Connection conn = null;?
try{?
 conn = DBConnectionFactory.getConnection;?
 conn.setAutoCommit(false);?
 //do something?
 conn.commit(); //commit transcation?
}catch(Exception e){?
 conn.rollback();?
}?
finally{?
 try{?
  conn.close();?
 } catch(SQLException se){ //do sth.}?
 //close ResultSet,PreparedStatement,Connection?
 //notice:Maybe ocurr Exception when u close rs,pstmt,conn?
}?

  按照以往的思路來寫代碼,代碼量比較長,而且容易疏忽,忘掉一些try/catch,引發(fā)一些異常無法catch,雖然有時候我們會寫DBTool類,來關(guān)閉這些資源,并且保證在關(guān)閉這些資源時,不向外拋異常,但是這樣做會導(dǎo)致額外的麻煩。?

  2、Spring提供的編程式的事務(wù)處理?

  Spring提供了幾個關(guān)于事務(wù)處理的類:TransactionDefinition //事務(wù)屬性定義?

  TranscationStatus //代表了當(dāng)前的事務(wù),可以提交,回滾。?

  PlatformTransactionManager這個是spring提供的用于管理事務(wù)的基礎(chǔ)接口,其下有一個實(shí)現(xiàn)的抽象類AbstractPlatformTransactionManager,我們使用的事務(wù)管理類例如DataSourceTransactionManager等都是這個類的子類。?

  我們使用編程式的事務(wù)管理流程可能如下:?

  (1) 聲明數(shù)據(jù)源。?

  (2) 聲明一個事務(wù)管理類,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等?

  (3) 在我們的代碼中加入事務(wù)處理代碼:?

TransactionDefinition td = new TransactionDefinition();?
TransactionStatus ts = transactionManager.getTransaction(td);?
try{?
 //do sth?
 transactionManager.commit(ts);?
}catch(Exception e){transactionManager.rollback(ts);}?

  使用Spring提供的事務(wù)模板TransactionTemplate:?

void add()?
{?
 transactionTemplate.execute( new TransactionCallback(){?
  pulic Object doInTransaction(TransactionStatus ts)?
  { //do sth}?
 }?
}?

  TransactionTemplate也是為我們省去了部分事務(wù)提交、回滾代碼;定義事務(wù)模板時,需注入事務(wù)管理對象。?

  3、Spring聲明式事務(wù)處理?

  Spring聲明式事務(wù)處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進(jìn)行事務(wù)代理。?

  使用TransactionInterceptor的步驟:?

  (1)定義數(shù)據(jù)源,事務(wù)管理類?

  (2)定義事務(wù)攔截器,例如:?

<bean id = "transactionInterceptor"?
class="org.springframework.transaction.interceptor.TransactionInterceptor">?
<property name="transactionManager"><ref bean="transactionManager"/></property>?
<property name="transactionAttributeSource">?
<value>?
com.test.UserManager.*r=PROPAGATION_REQUIRED?
</value>?
</property>?
</bean>?

  (3)為組件聲明一個代理類:ProxyFactoryBean?

<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">?
<property name="proxyInterfaces"><value>com.test.UserManager</value></property>?
<property name="interceptorNames">?
<list>?
<idref local="transactionInterceptor"/>?
</list>?
</property>?
</bean>?

  使用TransactionProxyFactoryBean:?

<bean id="userManager"?
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">?
<property name="transactionManager"><ref bean="transactionManager"/></property>?
<property name="target"><ref local="userManagerTarget"/></property>?
<property name="transactionAttributes">?
<props>?
<prop key="insert*">PROPAGATION_REQUIRED</prop>?
<prop key="update*">PROPAGATION_REQUIRED</prop>?
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>?
</props>?
</property>?
</bean>?

  TransactionProxyFactoryBean只是為組件的事務(wù)代理,如果我們要給組件添加一些業(yè)務(wù)方面的驗(yàn)證等,可以使用TransactionTemplate加攔截器方式,為組件添加多個攔截器,spring AOP中提供了三類Advice,即前增強(qiáng),后增強(qiáng),拋出異常時的增強(qiáng),可以靈活使用。

轉(zhuǎn)載于:https://www.cnblogs.com/baiduligang/p/4246971.html

總結(jié)

以上是生活随笔為你收集整理的spring是如何管理 事务的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。