事務(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
,還需要把PlatformTransactionManager
的nestedTransactionAllowed
(默認(rèn)值為False
)設(shè)為True
。
</p>