1、聲明式事務(wù)配置
* 配置SessionFactory
* 配置事務(wù)管理器
* 事務(wù)的傳播特性
* 那些類(lèi)那些方法使用事務(wù)
2、編寫(xiě)業(yè)務(wù)邏輯方法
* 繼承HibernateDaoSupport類(lèi),使用HibernateTemplate來(lái)持久化,HibernateTemplate是
Hibernate Session的輕量級(jí)封裝
* 默認(rèn)情況下運(yùn)行期異常才會(huì)回滾(包括繼承了RuntimeException子類(lèi)),普通異常是不會(huì)滾的
* 編寫(xiě)業(yè)務(wù)邏輯方法時(shí),最好將異常一直向上拋出,在表示層(struts)處理
* 關(guān)于事務(wù)邊界的設(shè)置,通常設(shè)置到業(yè)務(wù)層,不要添加到Dao上
3、了解事務(wù)的幾種傳播特性
1. PROPAGATION_REQUIRED: 如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù)則開(kāi)啟
2. PROPAGATION_SUPPORTS: 如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù),則非事務(wù)的執(zhí)行
3. PROPAGATION_MANDATORY: 如果已經(jīng)存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有一個(gè)活動(dòng)的事務(wù),則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 總是開(kāi)啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起。
5. PROPAGATION_NOT_SUPPORTED: 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。
6. PROPAGATION_NEVER: 總是非事務(wù)地執(zhí)行,如果存在一個(gè)活動(dòng)事務(wù),則拋出異常
7. PROPAGATION_NESTED:如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中. 如果沒(méi)有活動(dòng)事務(wù),
則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行
4、Spring事務(wù)的隔離級(jí)別
1. ISOLATION_DEFAULT: 這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別.
另外四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng)
2. ISOLATION_READ_UNCOMMITTED: 這是事務(wù)最低的隔離級(jí)別,它充許令外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。
這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。
3. ISOLATION_READ_COMMITTED: 保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)
4. ISOLATION_REPEATABLE_READ: 這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。
它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀)。
5. ISOLATION_SERIALIZABLE 這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行。
除了防止臟讀,不可重復(fù)讀外,還避免了幻像讀。
spring配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xmlns:aop="http://www./schema/aop"
xmlns:tx="http://www./schema/tx"
xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans-2.0.xsd
http://www./schema/aop http://www./schema/aop/spring-aop-2.0.xsd
http://www./schema/tx http://www./schema/tx/spring-tx-2.0.xsd">
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 配置事務(wù)的傳播特性 -->
<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>
<!-- 那些類(lèi)的哪些方法參與事務(wù) -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.bjsxt.usermgr.manager.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
</beans>