spring中提供了分層設計的業務層事務處理解決方案在這裡再說一次事務的四個特性:acidspring中的事務控制也是基於aop的,它既可以使用程式設計的方式實現,也可以使用配置的方式實現
所謂事務控制,就是根據我們給定的事務規則來執行提交或回滾操作。
spring並不會直接管理事務,而是提供了多種事務管理器:
這個介面是spring中的事務管理器,它裡面提供了我們常用的操作事務的方法,
提交事務:
回滾事務:
spring提供了platformtransactionmanager介面,然而具體的實現還是各大平台(jdbc、hibernate等)自己來完成的。
datasourcetransactionmanager:jdbc或mybatis使用(所在包:package org.springframework.jdbc.datasource;)
hibernatetransactionmanager:hibernate使用(所在包:package org.springframework.orm.hibernate5;)
注意上面獲取事務資訊狀態的介面方法gettransaction它的引數是乙個transactiondefinition型別,在這個介面中,就定義了一些基本的事務屬性
獲取事務的隔離級別
獲取事務的傳播行為
獲取事務超時時間
獲取事務是否唯讀
事務的屬性我們可以總結為五個方面:傳播行為、隔離規則、回滾規則、事務超時、是否唯讀
spring事務的傳播行為指的是:當多個事務同時存在的時候,spring如何處理這些事務的行為。共有七種:
①propagation_required:如果當前沒有事務,就建立乙個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定。
②propagation_supports:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。『
③propagation_mandatory:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就丟擲異常。
④propagation_requires_new:建立新事務,無論當前存不存在事務,都建立新事務。
⑤propagation_not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
⑥propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。
⑦propagation_nested:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則按required屬性執行。
事務屬性配置子標籤 tx:attributes
aop切面配置子標籤 aop:config
配置bean.xml
<?xml version="1.0" encoding="utf-8" ?>
xmlns
=""xmlns:xsi
=""xmlns:aop
=""xmlns:tx
=""xsi:schemalocation="
">
"transactionmanager"
class
="org.springframework.jdbc.datasource.datasourcetransactionmanager"
>
name
="datasource"
ref="datasource"
/>
bean
>
<
tx:adviceid=
"txadvice"
transaction-manager
="transactionmanager"
>
<
tx:attributes
>
<
tx:method
name
="find*"
propagation
="supports"
read-only
="true"
/>
<
tx:method
name
="get*"
propagation
="supports"
read-only
="true"
/>
<
tx:method
name
="*"
propagation
="required"
read-only
="false"
/>
tx:attributes
>
tx:advice
>
<
aop:config
>
<
aop:pointcutid=
"pointcut2"
expression
="execution(* com.zxy.service.impl.*.*(..))"
/>
<
aop:advisor
advice-ref
="txadvice"
pointcut-ref
="pointcut2"
/>
aop:config
>
beans
>
不光可以使用配置檔案的方式,spring中還提供了註解的方式,比起xml更加簡單,使用乙個註解,就可以保證方法在事務中執行
@transactional :
(同時出現時的優先順序:方法 > 類 > 介面)
在轉賬的實現類上增加乙個註解:
@transactional
@override
public
void
transfer
(string name1, string name2, double money)
@enabletransactionmanagement:開啟spring對註解的支援
在配置類中增加乙個註解
···
@enabletransactionmanagement
public
class
springconfig
; propagation propagation()
default propagation.required;
// 指定事務的傳播行為
isolation isolation()
default isolation.default;
// 指定事務的隔離級別
inttimeout()
default-1
;// 指定事務的超時時間
string timeoutstring()
default"";
boolean
readonly()
default
false
;// 指定是否為唯讀
class<
?extends
throwable
>
rollbackfor()
default
;// 指定會發生回滾的異常,陣列
string[
]rollbackforclassname()
default
;// 指定會發生回滾的異常的類名,陣列
class<
?extends
throwable
>
norollbackfor()
default
;// 指定不會發生回滾的異常,陣列
string[
]norollbackforclassname()
default
;// 指定不會發生回滾的異常的類名,陣列
spring中的事務控制
我們之前學了動態 而關於實物這塊,在每個service方法中總就那麼幾句話,而且地方也是固定的,所以我們也考慮用動態 來解決它,只是在spring中,框架已經為我們寫好了通知類,我們直接配置就好了,跟之前aop配置稍微有點不同,事務有它自己的配法,不過也差不多,看 這是我寫的乙個方法,模擬轉賬 pu...
Spring中的事務控制
一般而言,使用者的每次請求都對應乙個業務邏輯方法,並且每個業務邏輯方法往往具有邏輯上的原子性。此外,乙個業務邏輯方法往往包括一系列資料庫原子訪問操作,並且這些資料庫原子訪問操作應該繫結成乙個整體,即要麼全部執行,要麼全部不執行,通過這種方式我們可以保證資料庫的完整性,這就是事務。總的來說,事務是乙個...
Spring 事務 事務控制
0 註解 autowire 自動注入 url url b 1 spring專案中事務手動回滾 b transactionaspectsupport.currenttransactionstatus setrollbackonly 或者丟擲異常 transactional rollbackfor pu...