事務處理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
:指定事務的超時時長。