天天看點

怎麼使用Annotation進行聲明式事務管理

前言:

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,就是讀寫型事務,也就是在該事務中就能讀又能寫;

注意:該屬性是做優化使用的;也防止我們在隻讀事務中,寫了更改操作;