優勢:控制靈活,直觀易理解。數據庫
缺點:將事務代碼放入業務邏輯中,破壞了代碼的條理性。編程
優勢:簡單,不影響業務代碼(Spring推薦)。segmentfault
缺點:控制粒度只到方法級別併發
<property name="isolationLevelName" value="ISOLATION_READ_COMMITTED"/>
優化
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
spa
事務超時屬性定義一個事務容許執行的最長時間,達到最長時間沒有完成事務,則回滾,單位秒。<property name="timeout" value="30"/>
code
提示數據庫驅動程序和數據庫系統,這個事務並不包含寫入操做,數據庫就有可能該事務進行一些特定的優化,好比不安排相應的數據庫鎖,以減輕事務對數據庫的壓力。orm
<property name=「readOnly" value=「true"/>
blog
默認事務中拋出未檢查異常(繼承Error或RuntimeException的異常)則回滾,沒有異常或已檢查異常則提交。默認是這樣的,能夠經過設置回滾屬性修改。繼承
<property name =「rollbackFor" value =「xxxException"/> <property name =「noRollbackFor " value =「xxxException "/>
傳播行爲 [,隔離級別] [,只讀屬性] [,超時屬性] [不影響提交的異常] [,致使回滾的異常]
<property name="*Service"> PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED,TIMEOUT_20, +AbcException,+DefException,-HijException </property>
隔離級別是指若干個併發的事務之間的隔離程度。 併發事務之間的讀寫控制策略。
MySQL的「一致性讀」機制,能夠保證在REPEATABLE_READ
級別下解決「幻讀」問題。(基於InnoDB的multi-versioning )
T1{ O(A); T2{ O(B); O(C); }; O(D); };
若是當前存在事務,則加入該事務;若是當前沒有事務,則建立一個新的事務。
若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。
PROPAGATION_REQUIRED
若是當前存在事務,則加入該事務;若是當前沒有事務,則拋出異常。
PROPAGATION_REQUIRED
建立一個新的事務,若是當前存在事務,則把當前事務掛起。
掛起(Suspend):通知TransactionManager
再也不檢查某事務的狀態,直到Resume
AbstractPlatformTransactionManager. handleExistingTransaction()
T1{ O(A); T2{ O(B); O(C); }; O(D); };
如此示例:
以非事務方式運行,若是當前存在事務,則把當前事務掛起。
子事務自身無回滾,出現異常若向上拋,可能致使父事務回滾
父事務回滾時,不會影響子事務。
以非事務方式運行,若是當前存在事務,則拋出異常。
若是當前存在事務,則建立一個事務做爲當前事務的嵌套事務來運行
子事務依賴父事務:子事務於父事務提交時提交;父事務回滾,子事務也回滾。
Savepoint:子事務回滾時,父事務不回滾
版權聲明:本文爲博主「開花樹Tree」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://segmentfault.com/a/11...