Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          編程式事務&聲明式事務

          Posted on 2009-02-16 19:53 啥都寫點 閱讀(551) 評論(0)  編輯  收藏 所屬分類: J2EE

          采用編程式事務

          1、 getCurrentSession()openSession()的區別?

          * 采用getCurrentSession()創建的session會綁定到當前線程中,而采用openSession()創建的session則不會

          * 采用getCurrentSession()創建的sessioncommitrollback時會自動關閉,而采用openSession創建的session必須手動關閉

          2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

          * 如果使用的是本地事務jdbc事務)

          <property name=”hibernate.current_session_context_class”>thread</property>

          * 如果使用的是全局事務jta事務)

          <property name=”hibernate.current_session_context_class”>jta</property>

          采用聲明式事務

          聲明式事務配置

               * 配置SessionFactory

               * 配置事務管理器

               * 事務的傳播特性

               * 那些類哪些方法使用事務

          2、編寫業務邏輯方法

               * 繼承HibernateDaoSupport類,使用HibernateTemplate類持久化,HibernateTemplate

                 Hibernate session的封裝

          * 默認的回滾是RuntimeException(包括繼承RuntimeException的子類),普通異常不回滾

           * 在編寫業務邏輯方法時,最好將異常一直往上拋出,在呈現層處理(struts

           * spring的事務需要設置到業務方法上(事務邊界定義到Facade類上),不要添加到Dao

          3、了解事務的集中傳播忒性

               1PROPAGATION_REQUIRED:如果存在一個事務,則支持當前事務。如果沒有事務則開啟。

               2PROPAGATION_SUPPORTS:如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。

               3PROPAGATION_MANDATORY:如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。

               4PROPAGATION_REQUIRES_NEW:總是開啟一個新的事務。如果一個事務存在,則將這個存在的事務掛起。

               5PROPAGATION_NOT_SUPPORTED:總是非事務地執行,并掛起任何存在的事務。

               6PROPAGATION_NEVER:總是非事務地執行,如果存在一個活動事務,則拋出異常。

               7 PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中,如果沒有活動事務,則按TransactionDefinition.PROPAGATION_REQUIRED屬性執行

          4Spring事務的隔離級別

               1 ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。

               2ISOLATION_READ_UNCOMMITTED:這是事務最低的隔離級別,它允許另外一個事務可以看到這個事務未提交的數據。

               3ISOLATION_READ_COMMITTED:保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。

               4ISOLATION_REPEATALBE_READ: 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻想讀。它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。

               5ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不課重復讀外,還避免了幻想讀。

          事務屬性

          T1

          T2   

          Required

          T1

          T2

          T1

          RequiredNew

          T1

          T2

          T2

          Support

          T1

          T1

          Mandatory

          T1

          拋異常

          T1

          NoSupport

          T1

          Never

          T1

          拋異常

          à

          <!-- 配置sessionFactory -- >

          <bean id=”sessionFacory”class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>

          <property name=”configLocation”>

              <value>classpath:hibernate.cfg.xml</value>

          </property>

          </bean>

          <!-- 配置事務管理器-- >

          <beanid=”transactionManager”class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>

             <property name=”sessionFactory”>

              <ref bean=”sessionFactory”/>

          </property>

          </bean>

          <!-- 配置事務的傳播特性-- >

          <tx:advice id=”txAdvice” transaction-manager=”transactionManager”>

               <tx:attributes>

                   <tx:method name=”add*” propagation=”REQUIRED”/>

                   <tx:method name=”del*” propagation=”REQUIRED”/>

                   <tx:method name=”modify*” propagation=”REQUIRED”/>

                   <tx:method name=” *” read-only=”true”/> //只讀提高了性能         

          </tx:attributes>

          </tx:advice>

          <!-- 哪些類的哪些方法參與事務-- >

          <aop:config>

             <aop:pointcut id=”allManagerMethod” expression=”execution(* com.bjsxt.usermgr.manager.*.*(..))”/>

             <aop:advisor pointcut-ref=”allManagerMethod” advice-ref=”txAdvice”/>

          </aop:config>



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 墨竹工卡县| 长宁区| 屏南县| 高雄县| 屏山县| 大名县| 德阳市| 亳州市| 平山县| 玉林市| 尼勒克县| 松潘县| 沁源县| 天镇县| 邓州市| 沈丘县| 松潘县| 汝城县| 西安市| 田东县| 郁南县| 扶绥县| 铁岭县| 库伦旗| 云龙县| 宁蒗| 张掖市| 苍溪县| 威信县| 莱阳市| 隆化县| 全州县| 汪清县| 仲巴县| 临汾市| 广元市| 陆良县| 阿克| 宁国市| 横峰县| 罗江县|