spring配置和註解事務同時存在導致的事務巢狀

2021-09-23 19:21:32 字數 4162 閱讀 6016

首先先看配置檔案:

[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...