淺談Spring-1-事務管理

目錄

一、什麼是事務

二、四種事務特性(ACID)

三、處理事務時可能會出現的三種安全性問題

四、事務的隔離級別(5種)

五、Spring事務管理

1、Spring 當中的@Transactional註解

2、Spring當中的事務傳播行爲

六、事務應該如何配置


一、什麼是事務

事務是指邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗.

 

二、四種事務特性(ACID)

原子性 (atomicity):強調事務的不可分割.

一致性 (consistency):事務的執行的前後數據的完整性保持一致.

隔離性 (isolation):一個事務執行的過程中,不應該受到其他事務的干擾

持久性(durability) :事務一旦結束,數據就持久化到數據庫

 

三、處理事務時可能會出現的三種安全性問題

髒讀 :一個事務讀到了另一個事務的未提交的數據

不可重複讀 :一個事務讀到了另一個事務已經提交的 update 的數據導致多次查詢結果不一致.

虛幻讀 :一個事務讀到了另一個事務已經提交的 insert 的數據導致多次查詢結果不一致.

 

四、事務的隔離級別(5種)

DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.

未提交讀(read uncommited) :髒讀,不可重複讀,虛讀都有可能發生。是最低的事務隔離級別,它允許另外一個事務可以看到這個事務未提交的數據。

已提交讀 (read commited):避免髒讀。但是不可重複讀和虛讀有可能發生。保證一個事務提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。

可重複讀 (repeatable read) :這種事務隔離級別可以防止髒讀,不可重複讀。但是可能會出現幻象讀。它除了保證一個事務不能被另外一個事務讀取未提交的數據之外還避免了以下情況產生(不可重複讀)

串行化的 (serializable) :這是花費最高代價但最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀之外,還避免了幻象讀(避免三種問題)。

Mysql 默認事務隔離級別:可重複讀

Oracle 默認事務隔離級別:讀已提交

 

五、Spring事務管理

以上是數據庫和spring事務管理相通的部分,以下是spring的事務管理的特有的部分

1、Spring 當中的@Transactional註解

示例:

@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED,readOnly=true,rollbackFor=Exception.class)

1)回滾條件no-rollback-for與rollback-for:當AOP感知到何種異常時不執行回滾策略或者執行回滾策略。對於no-rollback-for,其覆蓋範圍爲指定的Exception極其子類。而對於rollback-for則包括其子類以及RuntimeException及其子類.也就是說對於rollback-for,除了指定的Exception,RuntimeException是默認在覆蓋範圍的,用戶無法通過rollback-for配置其它異常使得RuntimeException無法回滾

2)readOnly默認爲false。設置爲true時並不代表着此事務將只能讀不能寫,他對讀寫操作沒有任何限制。這只是一個標識,告訴事務管理器這個事務是隻讀的,讓事務管理器可以嘗試使用只讀的策略來優化這個事務。

2、Spring當中的事務傳播行爲

事務的傳播行爲:多個具有事務控制的service的相互調用時所形成的複雜的事務邊界控制(7種)

PROPAGION_XXX :事務的傳播行爲

* 保證同一個事務中

PROPAGATION_REQUIRED 支持當前事務,如果不存在 就新建一個(默認)

PROPAGATION_SUPPORTS 支持當前事務,如果不存在,就不使用事務

PROPAGATION_MANDATORY 支持當前事務,如果不存在,拋出異常

* 保證沒有在同一個事務中

PROPAGATION_REQUIRES_NEW 如果有事務存在,掛起當前事務,創建一個新的事務

PROPAGATION_NOT_SUPPORTED 以非事務方式運行,如果有事務存在,掛起當前事務

PROPAGATION_NEVER 以非事務方式運行,如果有事務存在,拋出異常

PROPAGATION_NESTED 如果當前事務存在,則嵌套事務執行


六、事務應該如何配置

首先要明確沒有通用的事務配置方式,要適合具體的業務場景。

1、如果只是對單個數據庫操作,對性能要求不大,對於數據要求嚴格一致,那麼把隔離級別設置爲serializable,傳播行爲設置爲PROPAGATION_MANDATORY

2、如果是微服務的分佈式系統,經常操作多個數據源,大多數的數據庫操作其實可以不用事務也不會有太大問題。對於少數對數據數據一致性有要求的可以單獨配置事務。這樣的系統的性能的要求是高一位的。

 

參考:https://blog.csdn.net/yue_hu/article/details/83340785

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章