Spring的事務管理概要

2021-10-03 03:28:48 字數 2941 閱讀 1996

使用propagation指定事務的傳播行為, 即當事務方法被另乙個事務方法呼叫時, 必須指定事務應該如何傳播(方法可能繼續在現有事務中執行, 也可能開啟乙個新事務, 並在自己的事務中執行)

傳播屬性

描述required★如果有事務在執行,當前的方法就在這個事務內執行,否則就啟用乙個新的事務,並在自己的事務內執行(預設值

required_new★當前的方法必須啟動新事務,並在它自己的事務內執行。如果有事務正在執行,應該將它掛起

supports

如果有事務在執行,當前的方法就在這個事務內執行。否則它可以不執行在事務中

not_supported

當前的方法不應該執行在事務中。如果有執行的事務,將它掛起

mandatory

當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常

never

當前的方法不應該執行在事務中。如果有執行的事務,就丟擲異常

nested

如果有事務在執行,當前的方法就應該在這個事務的巢狀事務內執行。否則就啟動乙個新的事務,並在它自己的事務內執行

使用isolation指定事務的隔離級別。從理論上來說, 事務應該彼此完全隔離, 以避免併發事務所導致的問題. 然而, 那樣會對效能產生極大的影響, 因為事務必須按順序執行. 在實際開發中,為了提公升效能, 事務會以較低的隔離級別執行。

事務的隔離級別要得到底層資料庫引擎的支援, 而不是應用程式或者框架的支援.

隔離級別

描述default

使用底層資料庫的預設隔離級別。對於大多數資料庫來說,預設隔離級別都是read_commited(預設值)

read_uncommitted

允許事務讀取未被其他事務提交的變更。髒讀,不可重複讀和幻讀的問題都會出現

read_commited

只允許事務讀取已經被其他事務提交的變更。可以避免髒讀,但不可重複讀和幻讀問題仍然可能出現

repeatable_read

確保事務可以多次從乙個欄位中讀取相同的值。在這個事務持續期間,禁止其他事務對這個字段進行更新。可以避免髒讀和不可重複讀,但幻讀的問題仍然存在

serializable

確保事務可以從乙個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該錶執行插入,更新和刪除操作。所有併發問題都可以避免,但效能十分低下

事務隔離級別

髒讀不可重複讀

幻讀讀未提交(read-uncommitted)是是

是讀已提交(read-committed)否是

是可重複讀(repeatable-read)否否

是序列化(serializable)否否

髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料

不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。

幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

預設情況下只有未檢查異常(runtimeexception和error型別的異常)會導致事務回滾. 而受檢查異常不會.

事務的回滾規則可以通過@transactional註解的rollbackfornorollbackfor屬性來定義. 這兩個屬性被宣告為 class 型別的, 因此可以為這兩個屬性指定多個異常類.

由於事務可以在行和表上獲得鎖, 因此長事務會占用資源, 並對整體效能產生影響. 如果乙個事物只讀取資料但不做修改, 資料庫引擎可以對這個事務進行優化.

//開啟事務之前要先配置事務管理器並開啟事務註解,然後新增@transactional的方法或類會被spring事務管理器管理

@service

("bookshopservice"

)public

class

bookshopserviceimpl

implements

bookshopservice

)@transactional

(propagation=propagation.requires_new,

isolation=isolation.read_committed,

readonly=

false

, timeout=3)

@override

public

void

purchase

(string username, string isbn)

catch

(interruptedexception e)

//1. 獲取書的單價

int price = bookshopdao.

findbookpricebyisbn

(isbn)

;//2. 更新數的庫存

bookshopdao.

updatebookstock

(isbn)

;//3. 更新使用者餘額

bookshopdao.

updateuseraccount

(username, price);}

}

Spring事務管理

spring是ssh中的管理員,負責管理其它框架,協調各個部分的工作。今天一起學習一下spring的事務管理。spring的事務管理分為宣告式跟程式設計式。宣告式就是在spring的配置檔案中進行相關配置 程式設計式就是用註解的方式寫到 裡。下面先說宣告式 spring配置檔案中關於事務配置總是由三...

spring事務管理

一 xml配置事務 二 註解的方式配置事務 bean id txmanaager class org.springframework.orm.hibernate3.hibernatetransactionmanager property name sessionfactory ref session...

spring 事務管理

和資料庫打交道的碼農都知道事務,事務有4大特徵,分別是原子性,一致性,隔離性,永續性。而spring 對事物提供了良好的支援,和api,通過簡單的配置,則可以減低程式設計師重複的操作。1.原子性 原子性指的是乙個事務內的所有操作要麼全部應用到資料庫,要麼取消對資料庫的操作。2.一致性 一致性和原子性...