Spring+Hibernate的實質: 就是把Hibernate用到的數據源Datasource,Hibernate的SessionFactory實例,事務管理器HibernateTransactionManager,都交給Spring管理。 那麼再沒整合之前Hibernate是如何實現事務管理的呢? 通過ServletFilter實現數據庫事務的管理,這樣就避免了在數據庫操作中每次都要進行數據庫事務處理。 一.事務的4個特性: 原子性:一個事務中所有對數據庫的操作是一個不可分割的操作序列,要麼全做,要麼全部做。 一致性:數據不會因爲事務的執行而遭到破壞。 隔離性:一個事務的執行,不受其他事務(進程)的干擾。既併發執行的個事務之間互不干擾。 持久性:一個事務一旦提交,它對數據庫的改變將是永久的。 二.事務的實現方式: 實現方式共有兩種:編碼方式;聲明式事務管理方式。 基於AOP技術實現的聲明式事務管理,實質就是:在方法執行前後進行攔截,然後在目標方法開始之前創建並加入事務,執行完目標方法後根據執行情況提交或回滾事務。 聲明式事務管理又有兩種方式:基於XML配置文件的方式;另一個是在業務方法上進行@Transactional註解,將事務規則應用到業務邏輯中。 三.創建事務的時機: 是否需要創建事務,是由事務傳播行爲控制的。讀數據不需要或只爲其指定只讀事務,而數據的插入,修改,刪除就需要事務管理了。 一種常見的事務管理配置:事務攔截器TransactionInterceptor和事務自動代理BeanNameAutoProxyCreator相結合的方式 <!--定義Hibernate的事務管理器HibernateTransactionManager --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 依賴注入上面定義的sessionFactory --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--定義Spring的事務攔截器TransactionInterceptor --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 依賴注入上面定義的事務管理器transactionManager --> <property name="transactionManager" ref="transactionManager"/> <!-- 定義需要進行事務攔截的方法及所採用的事務控制類型 --> <property name="transactionAttributes"> <props> <!-- 以browse、list、load、get及is開頭的所有方法採用只讀型事務控制類型 --> <prop key="browse*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop> <!-- 所有方法均進行事務控制,如果當前沒有事務,則新建一個事務 --> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 定義BeanNameAutoProxyCreatorf進行Spring的事務處理--> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 針對指定的bean自動生成業務代理 --> <property name="beanNames"> <list> <value>adminService</value> <value>columnsService</value> <value>newsService</value> <value>crawlService</value> <value>memberLevelService</value> <value>memberService</value> <value>categoryService</value> <value>merService</value> <value>cartService</value> <value>ordersService</value> <value>trafficService</value> </list> </property> <!-- 這個屬性爲true時,表示被代理的是目標類本身而不是目標類的接口 --> <property name="proxyTargetClass"> <value>true</value> </property> <!-- 依賴注入上面定義的事務攔截器transactionInterceptor --> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean>
SSH中的事務管理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.