Spring事務(wù)管理詳解(1)--基礎(chǔ)知識

事務(wù)的ACID

  • 原子性(Atomic): 事務(wù)中各項操作,要么全做要么全不做,任何一項操作的失敗都會導(dǎo)致整個事務(wù)的失敗
  • 一致性(Consistent): 事務(wù)結(jié)束后系統(tǒng)狀態(tài)是一致的;
  • 隔離性(Isolated): 并發(fā)執(zhí)行的事務(wù)彼此無法看到對方的中間狀態(tài)
  • 持久性(Durable): 事務(wù)完成后所做的改動都會被持久化,即使發(fā)生災(zāi)難性的失敗。通過日志和同步備份可以在故障發(fā)生后重建數(shù)據(jù)

2 基礎(chǔ)類TransactionDefinition

2.1 事務(wù)基本屬性的定義

2.1.1 事務(wù)的傳播行為--PropagationBehavior

<p>事務(wù)的傳播行為是指一個事務(wù)如何運(yùn)行,是在一個事務(wù)中運(yùn)行,還是在一個非事務(wù)中運(yùn)行,或者說掛起當(dāng)前事務(wù)等,Spring中定義了7種行為,如下:


????PROPAGATION_REQUIRED: Support a current transaction; create a new one if none exists. 如果存在一個事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù),則開啟一個新的事務(wù)。
????????例如:

????????A,B兩個方法,A中調(diào)用了B,并且全開啟事務(wù),單獨(dú)調(diào)用B會開啟一個新事務(wù)
????????單獨(dú)調(diào)用A會為A創(chuàng)建一個事務(wù),并且將B加入到該事務(wù)中。


????PROPAGATION_SUPPORTS: Support a current transaction; execute non-transactionally if none exists. 如果存在一個事務(wù),則加入當(dāng)前事務(wù)。如果沒有,則不在事務(wù)中執(zhí)行。

????????例如:

????????A,B兩個方法,A中調(diào)用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_SUPPORTS
????????如果單獨(dú)調(diào)用B不會開啟事務(wù)
????????單獨(dú)調(diào)用A則會開啟一個事務(wù)并將B加入到該事務(wù)當(dāng)中。
PROPAGATION_MANDATORY: Support a current transaction; throw an exception if no current transaction exists. 如果存在一個事務(wù),則加入到當(dāng)前事務(wù)。如果沒有,則拋出異常。
例如:
A,B兩個方法,A中調(diào)用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_MANDATORY
如果單獨(dú)調(diào)用B拋出異常 IllegalTransactionStateException
如果調(diào)用A,則開啟一個新事務(wù),并將B加入到該事務(wù)
PROPAGATION_REQUIRES_NEW: Create a new transaction, suspending the current transaction if one exists. 創(chuàng)建一個新事務(wù),如果當(dāng)前事務(wù)已存在,則掛起當(dāng)前事務(wù)。
A,B兩個方法,A中調(diào)用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_REQUIRES_NEW
如果單獨(dú)調(diào)用B,則為B創(chuàng)建一個新事務(wù)
如果調(diào)用A,則開啟一個新事務(wù),將A的事務(wù)掛起,為B創(chuàng)建一個新事務(wù)
注意:需要JtaTransactionManager事務(wù)管理器
PROPAGATION_NOT_SUPPORTED: Do not support a current transaction; rather always execute non-transactionally. 總是非事務(wù)的執(zhí)行,如果當(dāng)前存在一個事務(wù),則掛起當(dāng)前事務(wù)。
A,B兩個方法,A中調(diào)用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_NOT_SUPPORTED
如果單獨(dú)調(diào)用B,非事務(wù)運(yùn)行
如果調(diào)用A,則開啟一個新事務(wù),將A的事務(wù)掛起,非事務(wù)運(yùn)行B
注意:需要JtaTransactionManager事務(wù)管理器
PROPAGATION_NEVER: Do not support a current transaction; throw an exception if a current transaction exists. 總是非事務(wù)的執(zhí)行,如果存在一個事務(wù),則拋出異常
A,B兩個方法,A中調(diào)用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_NOT_SUPPORTED
如果單獨(dú)調(diào)用B,非事務(wù)運(yùn)行
如果調(diào)用A,則開啟一個新事務(wù),將A的事務(wù)掛起,運(yùn)行B時拋出異常
PROPAGATION_NESTED: Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. 如果一個活動的事務(wù)存在,則運(yùn)行在一個嵌套的事務(wù)中。如果沒有活動的事務(wù),則按照PROPAGATION_REQUIRED執(zhí)行。當(dāng)使用jdbc3.0驅(qū)動時,僅僅支持DataSourceTransactionManager作為事務(wù)管理器,需要JDBC驅(qū)動的java.sql.SavePoint類。有一些JTA的事務(wù)管理器實現(xiàn)可能也提供了同樣的功能。
使用PROPAGATION_NESTED,還需要把PlatformTransactionManagernestedTransactionAllowed(默認(rèn)值為False)設(shè)為True
</p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容