012,spring boot事務概念講解

事務處理mysql

1、事務有四個特性:sql

ACID數據庫

原子性(Atomicity):事務是一個原子操做,由一系列動做組成。事務的原子性確保動做要麼所有完成,要麼徹底不起做用。後端

一致性(Consistency):一旦事務完成(無論成功仍是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的數據不該該被破壞。併發

隔離性(Isolation):可能有許多事務會同時處理相同的數據,所以每一個事務都應該與其餘事務隔離開來,教程

防止數據損壞。事務

持久性(Durability):一旦事務完成,不管發生什麼系統錯誤,它的結果都不該該受到影響,這樣就能從ci

任何系統崩潰中恢復過來。一般狀況下,事務的結果被寫到持久化存儲器中。資源

2、傳播行爲文檔

當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運

行,也可能開啓一個新事務,並在本身的事務中運行。

Spring定義了七種傳播行爲:

PROPAGATION_REQUIRED

表示當前方法必須運行在事務中。若是當前事務存在,方法將會在該事務中運行。不然,會啓動一個新的事務,Spring默認使用PROPAGATION_SUPPORTS  表示當前方法不須要事務上下文,可是若是存在當前事務的話,那麼該方法會在這個事務中運行PROPAGATION_MANDATORY  表示該方法必須在事務中運行,若是當前事務不存在,則會拋出一個異常

PROPAGATION_REQUIRED_NEW

表示當前方法必須運行在它本身的事務中。一個新的事務將被啓動。若是

存在當前事務,在該方法執行期間,當前事務會被掛起。若是使用

JTATransactionManager

的話,則須要

訪問

TransactionManager

PROPAGATION_NOT_SUPPORTED

表示該方法不該該運行在事務中。若是存在當前事務,在該方法運行期

間,當前事務將被掛起。若是使用

JTATransactionManager

的話,則須要訪問

TransactionManager

PROPAGATION_NEVER

表示當前方法不該該運行在事務上下文中。若是當前正有一個事務在運行,則會拋

出異常

PROPAGATION_NESTED

表示若是當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套的事務

能夠獨立於當前事務進行單獨地提交或回滾。若是當前事務不存在,那麼其行爲與

PROPAGATION_R

EQUIRED

同樣。注意各廠商對這種傳播行爲的支持是有所差別的。能夠參考資源管理器的

文檔來確認它們是否支持嵌套事務

3、隔離級別

隔離級別定義了一個事務可能受其餘併發事務影響的程度。

ISOLATION_DEFAULT

使用後端數據庫默認的隔離級別

Spring

默認使用

mysql

默認的隔離級別爲

Repeatable Read

(

可重複讀

)

ISOLATION_READ_UNCOMMITTED

讀未提交,

最低的隔離級別,容許讀取還沒有提交的數據變動,可能會致使

髒讀、幻讀或不可重複讀

ISOLATION_READ_COMMITTED

讀已提交,

容許讀取併發事務已經提交的數據,能夠阻止髒讀,可是幻讀

Spring

Boot

基礎教程

做者

馮永偉

2

果學院

http://www.roncoo.com

或不可重複讀仍有可能發生

ISOLATION_REPEATABLE_READ

可重複讀,

對同一字段的屢次讀取結果都是一致的,除非數據是被自己事

務本身所修改,能夠阻止髒讀和不可重複讀,但幻讀仍有可能發生

ISOLATION_SERIALIZABLE

可串行化,

最高的隔離級別,徹底服從

ACID

的隔離級別,確保阻止髒讀、不可

重複讀以及幻讀,也是最慢的事務隔離級別,由於它一般是經過徹底鎖定事務相關的數據

庫表來實現的

髒讀(

Dirty reads

——

髒讀

發生在一個事務讀取了另外一個事務改寫但還沒有提交的數據時。若是改寫再

稍後被回滾了,那麼第一個事務獲取的數據就是無效的。

不可重複讀(

Nonrepeatable read

——

不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,但

是每次都獲得不一樣的數據時。這一般是由於另外一個併發事務在兩次查詢期間進行了更新。

幻讀(

Phantom

read

——

幻讀與不可重複讀相似。它發生在一個事務(

T1

)讀取了幾行數據,接着另外一

個併發事務(

T2

)插入了一些數據時。在隨後的查詢中,第一個事務(

T1

)就會發現多了一些本來不存在

的記錄。

屬性說明

@Transactional

a

isolation

:用於指定事務的隔離級別。默認爲底層事務的隔離級別。

b

noRollbackFor

:指定遇到指定異常時強制不回滾事務。

c

noRollbackForClassName

:指定遇到指定多個異常時強制不回滾事務。該屬性能夠指定多個異常類

名。

d

propa

gation:

指定事務的傳播屬性。

e

readOnly

:指定事務是否只讀。

表示這個事務只讀取數據但不更新數據,這樣能夠幫助數據庫引擎優

化事務。若真的是一個只讀取

的數據庫

應設置

readOnly=true

f

rollbackFor

:指定遇到指定異常時強制回滾事務。

g

rollbackForClassName

:指定遇到指定多個異常時強制回滾事務。該屬性能夠指定多個異常類名。

h

timeout

:指定事務的超時時長。

相關文章
相關標籤/搜索