宣告式事務管理(基於AOP)

2021-09-02 07:23:04 字數 4164 閱讀 9825

邏輯上的一組操作,組成這組操作的各個單元,要麼全都成功,要麼全都失敗。

建立accountdao介面,其中包含乙個轉賬方法

accountdao介面

public

inte***ce

accountdao

accountdaoimpl實現類

public

class

accountdaoimpl

implements

accountdao

}

"datasource"

class

="org.springframework.jdbc.datasource.drivermanagerdatasource"

>

name

="driverclassname"

value

="com.mysql.jdbc.driver"

/>

name

="url"

value

="jdbc:mysql://localhost/spring"

/>

name

="username"

value

="root"

/>

name

="password"

value

="root"

/>

bean

>

"jdbctemplate"

class

="org.springframework.jdbc.core.jdbctemplate"

>

name

="datasource"

ref="datasource"

/>

bean

>

"accountdao"

class

="com.itheima.jdbc.accountdaoimpl"

>

name

="jdbctemplate"

ref="jdbctemplate"

/>

bean

>

name

="datasource"

ref="datasource"

/>

bean

>

<

tx:adviceid=

"txadvice"

transaction-manager

="transactionmanager"

>

<

tx:attributes

>

<

tx:method

name

="*"

propagation

="required"

isolation

="default"

read-only

="false"

/>

tx:attributes

>

tx:advice

>

<

aop:config

>

<

aop:pointcut

expression

="execution(* com.itheima.jdbc.*.*(..))"

id="txpointcut"

/>

<

aop:advisor

advice-ref

="txadvice"

pointcut-ref

="txpointcut"

/>

aop:config

>

測試:當呼叫轉賬方法時,如果發生異常,因為配置了事務管理器,賬戶餘額應該都不變;如果沒有配置事務,會發現其中轉賬一方金額增加,另乙個金額不變,這在轉賬中是不被允許的。

@test

public

void

annotationtest()

在spring容器中註冊事務註解驅動

<

tx:annotation-driven

transaction-manager

="transactionmanager"

/>

在需要使用事務的spring bean類或者bean類的方法上新增註解@transactional。在類上對所有方法都有效,在某個方法上,只對該方法有效。

引數名稱

描述value

指定要使用的事務管理器

transactionmanager

指定事務的限定符值

isolation

指定事務的隔離級別

norollbackfor

特定異常不回滾

norollbackforclassname

特定的多個異常不回滾

propagation傳播行為

read-only

事務是否唯讀

rollbackfor

遇到特定異常強制回滾事務

rollbackforclassname

遇到多個特定異常強制回滾事務

timeout

事務超時時長

spring配置事務註解驅動

"datasource"

class

="org.springframework.jdbc.datasource.drivermanagerdatasource"

>

name

="driverclassname"

value

="com.mysql.jdbc.driver"

/>

name

="url"

value

="jdbc:mysql://localhost/spring"

/>

name

="username"

value

="root"

/>

name

="password"

value

="root"

/>

bean

>

"jdbctemplate"

class

="org.springframework.jdbc.core.jdbctemplate"

>

name

="datasource"

ref="datasource"

/>

bean

>

"accountdao"

class

="com.itheima.jdbc.accountdaoimpl"

>

name

="jdbctemplate"

ref="jdbctemplate"

/>

bean

>

name

="datasource"

ref="datasource"

/>

bean

>

<

tx:annotation-driven

transaction-manager

="transactionmanager"

/>

在方法上新增註解

public

class

accountdaoimpl

implements

accountdao

@transactional

(propagation = propagation.required,

isolation = isolation.default, readonly =

false

)public

void

transfer

(string outuser, string inuser, double money)

}

宣告式事務管理

基於spring的aop的宣告式事務管理 這種管理方式只需要保證事務層方法命名有一定的規律,通過配置即可實現。基於 transational的宣告式事務管理 這種方式的事務管理是基於spring註解實現的,只需要在需要管理的事務層上加上該註解即可。配置註解自動掃瞄 新增註解 transactiona...

Spring宣告式事務管理

使用事務的目的是將整個業務的邏輯處理置於同乙個事務中,方便對整個業務進行管理,如業務的事務回滾 在編寫 時,為了將乙個業務的核心邏輯處理放入事務中,有時會這樣寫 session session sf.opensession 開啟乙個session session.gettransaction beg...

Spring宣告式事務管理

spring的宣告式事務管理,可以說是開發人員的福音,也是架構師們的法寶 通過這個神器我們可以有效的解決事務不一致 連線洩露等問題 下面我們就介紹一下spring宣告式事務的配置 1 建立事務管理器 2 制定事務管理 3 建立切面 備註 事務管理機制說明propagation 屬性值 require...