前言:
Spring對于各種各樣的ORM架構(包括JDBC) 都可以它進行聲明式事務管理,以下講
解的是Spring對Hibernate的聲明式事務管理,也是用的最多的;
一.導入命名空間并注入SessionFactory
在spring配置檔案中beans元素中:
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation=”
http://www.springframework.org/schema/tx
2.注入SessionFactory;
二.配置Hibernate事務管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
注意:
(1)使用HibernateTransactionManager類管理事務, 其實這個類就相當于一個
aspect(切面類),運用了AOP原理;
(2)這是作為公共使用的事務管理器Bean。這個會事先配置好,不需要各個子產品各
自去配(也就是有多個spring配置檔案時);
(3)HibernateTransactionManager這個類怎麼管理事務呢?這裡就使用了
SessionFactory,從SessionFactory中擷取連接配接,是以這裡需要需要注入一個
SessionFactory;
三. 增加Annotation驅動的Transaction管理:
<tx:annotation-driven transaction-manager=“transactionManager”/>
注意:transaction-manager屬性需要指定一個TransactionManager(也就是事務管理器), 對于Hibernate的事務管理你需要指定Hibernate事務管理器;
四.關于@Transactional注解的使用:
前言:
(1)如果你需要在一個方法中增加事務,這時你就可以在這個方法上添加@Transactional
注解,它會自動在方法執行前與方法執行後添加關于事務的業務邏輯(也就是
@Transactional使用了AOP程式設計模式);
(2)在Spring預設情況下,如果捕捉到的或則抛出的是一個RuntimeException 會自 動復原事務;
(3)其實Hibernate在運作期間抛出的異常均為RuntimeException
好處:
在Spring中對Hibernate進行事務管理,可以把我們的重點放在業務邏輯上,而 不必在關注try…catch…finally (發生異常時對事務的操作);
[email protected]注解的配置:
屬性:
1)propagation:
在Spring為事務的傳播性(也就是事務的産生過程), 預設值為
Propagation.REQUIRED;
類型:枚舉類型Propagation;
Propagation枚舉類型中共有5個取值:
2.事務的傳播行為
1).requierd
如果有事務那麼加入事務,沒有的話建立一個
2).not_supported
不開啟事務
3).requires_new
不管是否存在事務,都建立一個新的事務,原來的挂起,新的執行完,繼續執行老事務
4).mandatory
必須在一個已有的事務中執行,否則抛出異常
5).never
必須在一個沒有的事務中執行,否則抛出異常
6).supports
如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務那就不用事務
3.readOnly:布爾類型
如果取值為true,就是隻讀型事務,也就是在該事務中沒有insert、update、delete
操作;
如果取值為false,就是讀寫型事務,也就是在該事務中就能讀又能寫;
注意:該屬性是做優化使用的;也防止我們在隻讀事務中,寫了更改操作;