PROPAGATION_REQUIRED事務管理


PROPAGATION_REQUIRED事務

 

采用編程式事務
1、 getCurrentSession()與openSession()的區別?

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

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

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

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

<property name=”hibernate.current_session_cont ext_class”>thread</property>

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

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

采用聲明式事務
聲明式事務配置

* 配置SessionFactory

* 配置事務管理器

* 事務的傳播特性

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

2、編寫業務邏輯方法

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

是Hibernate session的封裝

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

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

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

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

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

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

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

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

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

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

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

4、Spring事務的隔離級別

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

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

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

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

5、ISOLATION_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.o rm.hibernate3.LocalSessionFactoryBean”>

<property name=”configLo cation”>

<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=”a dd*” 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:point cut id=”allManagerMethod” expression=”execution(* com.bjsxt.usermgr.manager.*.*(..))”/>

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

</aop:config>

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com