首先先看配置檔案:
[html]
view plain
copy
<
beanid=
"sessionfactory"
class
="org.springframework.orm.hibernate3.localsessionfactorybean"
>
<
property
name
="datasource"
ref=
"datasource"
/>
<
property
name
="hibernateproperties"
>
<
props
>
<
prop
key=
"hibernate.hbm2ddl.auto"
>
update
prop
>
<
prop
key=
"hibernate.show_sql"
>
true
prop
>
<
prop
key=
"hibernate.format_sql"
>
true
prop
>
<
prop
key=
"connection.autoreconnect"
>
true
prop
>
<
prop
key=
"connection.autoreconnectforpools"
>
true
prop
>
<
prop
key=
"connection.is-connection-validation-required"
>
true
prop
>
<
prop
key=
"hibernate.dialect"
>
org.hibernate.dialect.mysqldialect
prop
>
props
>
property
>
<
property
name
=>
<
list
>
<
value
>
classpath*:*oddtech/bean
value
>
list
>
property
>
bean
>
<
beanid=
"txmanager"
class
="org.springframework.orm.hibernate3.hibernatetransactionmanager"
>
<
property
name
="sessionfactory"
ref=
"sessionfactory"
/>
bean
>
<
tx:annotation-driven
transaction-manager
="txmanager"
order
="0"
/>
<
aop:config
>
<
aop:pointcut
expression
="execution(* oddtech.service.impl.*.*(..))"id=
"txpoint"
/>
<
aop:advisor
advice-ref
="txadvice"
pointcut-ref
="txpoint"
order
="1"
/>
aop:config
>
<
tx:advice
transaction-manager
="txmanager"id=
"txadvice"
>
<
tx:attributes
>
<
tx:method
name
="find*"
propagation
="required"
read-only
="true"
rollback-for
="exception"
/>
<
tx:method
name
="select*"
propagation
="required"
read-only
="true"
rollback-for
="exception"
/>
<
tx:method
name
="insert*"
propagation
="required"
rollback-for
="exception"
/>
<
tx:method
name
="delete*"
propagation
="required"
rollback-for
="exception"
/>
<
tx:method
name
="update*"
propagation
="required"
rollback-for
="exception"
/>
<
tx:method
name
="modify*"
propagation
="required"
rollback-for
="exception"
/>
<
tx:method
name
="*"
read-only
="true"
rollback-for
="exception"
/>
tx:attributes
>
tx:advice
>。
當在oddtech.service.impl包下某個類(test)某個方法(insert)使用了@transactional,相當於在執行new test().insert() 方法執行2次aop切面。那麼我們需要通過order 屬性去定義aop切面的先後執行順序。 order越小,在aop的chain 中越靠前,越先執行。(chain模式)
。這樣就屬於事務巢狀。
那麼我們再看上邊說的例子:當在oddtech.service.impl包下某個類(test)某個方法(insert)使用了@transactional,那麼我們想讓insert 方法唯讀,read-only=true,那麼我們需要這樣去定義:@transactional(readonly = true,propagation=propagation.required),為什麼呢?
在宣告事務中,我們對insert 的事務傳播級別定義為:required,關於事務傳播級別,請參照那麼在註解事務中我們定義required 的事務。宣告事務在使用註解定義的事務級別。
除非在特殊的情況下,註解事務不要和宣告事務有衝突。宣告事務定義的是統一的規則,如果你想讓某乙個方法有特殊的事務傳播機制的話,那麼不要和統一的規則有衝突。
按照規則,定義乙個test方法,加入:@transactional定義。則test 方法為read-only=false,propagation=required。這是預設的。統一規則不會對test方法的註解事務衝突。
SPRING註解事務管理
quote 大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。事物註解方式 transactional 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservice...
spring註解事務傳播行為
在 service 類前加上 transactional 宣告這個 service 所有方法需要事務管理。每乙個業務方法開始時都會開啟乙個事務。spring 預設情況下會對執行期例外 runtimeexception 進行事務回滾。這個例外是 unchecked 如果遇到 checked 意外就不回...
spring事務註解配置
目前常用的spring事務配置就是兩種,使用tx命名空間和使用註解配置。在使用註解配置的時候,你只需要在spring的上下文配置下加入兩行 ok,配置完成,接下去你只在需要事務的方法或類上定義事務即可。這項配置告訴spring去檢查容器中所有不管在類層面還是方法層面配置了註解 transaction...