一、全局事務html
基本的支持分佈式事務;spring
在業內,主要用來解決分佈式事務的方案是使用柔性事務。柔性事務包括幾種類型:兩階段型、補償型、異步確保型和最大努力通知型。sql
事務管理器控制着全局事務,管理事務生命週期,並協調資源。資源管理器負責控制和管理實際資源。在全局事務中,爲了保證全部的操做能夠一次性要麼全提交,要麼全失敗。事務管理器和資源管理器之間的事務操做的控制是採用2PC(兩階段提交)來進行的。數據庫
二、本地事務編程
JDBC事務異步
ACID,指數據庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。分佈式
1 public interface PlatformTransactionManager { 2 3 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 4 5 void commit(TransactionStatus status) throws TransactionException; 6 7 void rollback(TransactionStatus status) throws TransactionException; 8 }
一、TransactionDefinition的說明優化
對應數據庫中的隔離級別:http://www.cnblogs.com/bigshark/p/7912184.htmlspa
ISOLATION_DEFAULT代理 |
使用數據庫的隔離級別 |
ISOLATION_READ_UNCOMMITTED |
未提交讀 |
ISOLATION_READ_COMMITTED |
提交讀 |
ISOLATION_REPEATABLE_READ |
可重複讀-Mysql默認級別 |
ISOLATION_SERIALIZABLE |
可串行化 |
PROPAGATION_REQUIRED |
方法必須運行在事務中,若是當前事務存在,方法會在當前事務運行,不然啓動一個新事務。 |
PROPAGATION_SUPPORTS |
方法不須要事務上下文,可是若是存在當前事務,則會在這個事務中運行。 |
PROPAGATION_MANDATORY |
方法必須運行在事務中,若是當前事務不存在,則拋出異常。 |
PROPAGATION_REQUIRES_NEW |
方法必須運行在它本身的事務中,若是存在當前事務,事務將被掛起。 |
PROPAGATION_NOT_SUPPORTED |
方法不該該運行在事務中,若是存在當前事務,事務將被掛起。 |
PROPAGATION_NEVER |
方法不該該運行在事務上下文中,若是當前有事務在運行,則拋出異常。 |
PROPAGATION_NESTED |
若是當前已經存在一個事物,方法會在嵌套事務中運行,嵌套事務能夠獨立提交或回滾;若是不存在事務,其行爲和PROPAGATION_REQUIRED同樣。 |
二、TransactionStatus提供全部事務API通用的,用來控制事務執行和事務狀態查詢的簡單方法
1 public interface TransactionStatus extends SavepointManager { 2 3 boolean isNewTransaction(); 4 5 boolean hasSavepoint(); 6 7 void setRollbackOnly(); 8 9 boolean isRollbackOnly(); 10 11 void flush(); 12 13 boolean isCompleted(); 14 15 }
三、PlatformTransactionManager的使用須要應用DataSource數據源,DataSourceTransactionManager支持JDBC和MyBatis場景。
1 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 2 <property name="dataSource" ref="dataSource"/> 3 </bean>
Spring的聲明式事務是經過Spring AOP實現的。
調用事務代理的方法的過程:
Spring提供兩種編程式事務的方法:TransactionTemplate、PlatformTransactionManager
資料
《Spring In Action》