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 也可以寫我們自己的自動 自定...