四 Spring與Hibernate整合 事務

2021-06-09 05:50:51 字數 3868 閱讀 2559

l  採用getcurrentsession()建立的session會繫結到當前執行緒中,而採用opensession()建立的session則不會(每open一次就開啟乙個)

l  採用getcurrentsession()建立的session在commit或rollback時會自動關閉,而採用opensession()建立的session必須手動關閉

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

thread

l如果使用的是全域性事務(jta事務)

jta

需要下面四步:

配置sessionfactory

配置事務管理器

事務的傳播特性

哪些類哪些方法使用事務

<

beanid=

"sessionfactory"

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"

>

<

refbean

="sessionfactory"

/>

property

>

bean

>

<

tx:adviceid=

"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

expression

="execution(* com.xasxt.transaction.model.*.*(..))"

id="allmanagermethod"

/>

<

aop:advisor

advice-ref

="txadvice"

pointcut-ref="

allmanagermethod

"/>

aop:config

>

l繼承hibernatedaosupport類,使用hibernatetemplate來持久化,hibernatetemplate是hibernate session的輕量級封裝

l預設情況下執行期異常才會回滾(包括繼承了runtimeexception子類),普通異常是不會回滾的

l編寫業務邏輯方法時,最好將異常一直向上丟擲,在表示層(struts)處理

l關於事務邊界的設定,通常設定到業務層,不要新增到dao上

宣告式事務業務邏輯的編寫示例如下:

public

classusermanagerimplextends

hibernatedaosupport

implementsiusermanager

@override

public

voidadduser(user user) }

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 屬性執行

對事務傳播特性的理解:

事務屬性 t1

t2required 無

t1 t2 t1

requirednew 無

t1 t2 t2

support 無

t1 無 t1

mandatory 無

t1 拋異常 t1

nosupport 無

t1 無 無

never 無

t1 無 拋異常

1.isolation_default:這是乙個platfromtransactionmanager預設的隔離級別,使用資料庫預設的事務隔離級別.

另外四個與jdbc的隔離級別相對應

2.isolation_read_uncommitted:這是事務最低的隔離級別,它充許令外乙個事務可以看到這個事務未提交的資料。

這種隔離級別會產生髒讀,不可重複讀和幻像讀。

3.isolation_read_committed:保證乙個事務修改的資料提交後才能被另外乙個事務讀取。另外乙個事務不能讀取該事務未提交的資料

4.isolation_repeatable_read:這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。

它除了保證乙個事務不能讀取另乙個事務未提交的資料外,還保證了避免下面的情況產生(不可重複讀)。

5.isolation_serializable 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。

除了防止髒讀,不可重複讀外,還避免了幻像讀。

四 Spring與Hibernate整合 事務

l 採用getcurrentsession 建立的session會繫結到當前執行緒中,而採用opensession 建立的session則不會 每open一次就開啟乙個 l 採用getcurrentsession 建立的session在commit或rollback時會自動關閉,而採用openses...

Spring 第二章 Spring與IoC(四)

用於替換bean的註冊 2.4.1 定義bean component 該屬性的value值用於指定bean的id 與 component註解功能相同,但意義不同的註解還有三個 repository 註解在dao實現類上 service 註解在service實現類上 controller 註解在spr...

Spring程式設計《四》

配置檔案中的自動 在配置檔案中加 使得每次使用bean時,他會自動給bean新增切面advisor class org.springframework.aop.framework.autoproxy.defaultadvisorautoproxycreator bean 也可以寫我們自己的自動 自定...