Spring 事務傳播實踐分析

2022-05-02 09:39:10 字數 2869 閱讀 1957

事務管理是應用系統開發中必不可少的一部分。事物將若干的資料庫操作作為乙個整體控制,一起成功或一起失敗。事物有以下特性

原子性:指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

一致性:指事務前後資料的完整性必須保持一致。

隔離性:指多個使用者併發訪問資料庫時,乙個使用者的事務不能被其他使用者的事務所干擾,多個併發事務之間資料要相互隔離。

永續性:指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,即時資料庫發生故障也不應該對其有任何影響。

spring 為事務管理提供了豐富的功能支援。spring 事務管理分為編碼式和宣告式的兩種方式。程式設計式事務指的是通過編碼方式實現事務;宣告式事務基於 aop,將具體業務邏輯與事務處理解耦。宣告式事務管理使業務**邏輯不受汙染, 因此在實際使用中宣告式事務用的比較多。宣告式事務有兩種方式,一種是在配置檔案(xml)中做相關的事務規則宣告,另一種是基於@transactional 註解的方式。注釋配置是目前流行的使用方式,因此本文將著重介紹基於@transactional 註解的事務管理。

@transactional 註解的屬性資訊

屬性名說明

name

當在配置檔案中有多個 transactionmanager , 可以用該屬性指定選擇哪個事務管理器。

propagation

事務的傳播行為,預設值為 required。

isolation

事務的隔離度,預設值採用 default。

timeout

事務的超時時間,預設值為-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務。

read-only

指定事務是否為唯讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定 read-only 為 true。

rollback-for

用於指定能夠觸發事務回滾的異常型別,如果有多個異常型別需要指定,各型別之間可以通過逗號分隔。

no-rollback- for

丟擲 no-rollback-for 指定的異常型別,不回滾事務。

其中,mysql預設採用repeatable_read隔離級別;oracle預設採用read_committed隔離級別

依據事務的隔離級別將會有三種情況發生。

髒讀:乙個事務會讀進還沒有被另乙個事務提交的資料,所以你會看到一些最後被另乙個事務回滾掉的資料。

不可重複讀:乙個事務讀進一條記錄,另乙個事務更改了這條記錄並提交完畢,這時候第乙個事務再次讀這條記錄時,它已經改變了

幻影讀:乙個事務用where子句來檢索乙個表的資料,另乙個事務插入一條新的記錄,並且符合where條件,這樣,第乙個事務用同乙個where條件來檢索資料後,就會多出一條記錄

我們首先先實驗事務的傳播

注意:所有的測試都是呼叫method1

public

void

method1()

@transactional(propagation =propagation.required)

public

void

method2(integer id)

結果:都不回滾

public

void

method1()

@override

@transactional(propagation =propagation.required)

public

void

method2()

結果:都不回滾

//

@transactional(propagation = propagation.required)

public

void

method1()

@override

@transactional(propagation =propagation.requires_new)

public

void

method2()

結果:都不回滾

@transactional(propagation =propagation.required)

public

void

method1()

@override

//@transactional(propagation = propagation.required)

public

void

method2()

結果:回滾

@transactional(propagation =propagation.required)

public

void

method1()

@override

@transactional(propagation = propagation.requires_new, readonly = true

)

public

void

method2()

結果:不回滾,如果直接呼叫method2,則會報錯,說明自呼叫時註解時沒有效果的。

在 spring 的 aop **下,只有目標方法由外部呼叫,目標方法才由 spring 生成的**物件來管理,這會造成自呼叫問題。若同一類中的其他沒有@transactional 註解的方法內部呼叫有@transactional 註解的方法,有@transactional 註解的方法的事務被忽略,不會發生回滾。

這是由於使用 spring aop **造成的。為解決這兩個問題,使用 aspectj 取代 spring aop **。

spring事務傳播

採用程式設計式事務 1 getcurrentsession 與opensession 的區別?採用getcurrentsession 建立的session會繫結到當前執行緒中,而採用opensession 建立的session則不會 採用getcurrentsession 建立的session在co...

Spring事務傳播

required 預設 如果當前存在事務,就加入該事務,如果不存在,則建立乙個新的事務 supports 如果呼叫者有事務,則加入該事務,如果沒有,則以非事務方式執行 mandatory 如果存在事務,則加入該事務,如果不存在事務,則拋異常 requires new 重新建立乙個新的事務,如果當前存...

Spring事務傳播

package org.springframework.transaction import org.springframework.lang.nullable public inte ce transactiondefinition 事務的傳播面向的是乙個方法在另乙個方法中執行時對事務的處理方式。...