Spring中的事務控制

2021-10-13 19:30:06 字數 4245 閱讀 1345

spring中提供了分層設計的業務層事務處理解決方案

spring中的事務控制也是基於aop的,它既可以使用程式設計的方式實現,也可以使用配置的方式實現

所謂事務控制,就是根據我們給定的事務規則來執行提交或回滾操作。

在這裡再說一次事務的四個特性:acid

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