org.springframework.orm.jpa.JpaTransactionManager JPA事務管理類java
org.springframework.orm.hibernate3.HibernateTransactionManager Hibernate3.0事務管理類spring
org.springframework.orm.jdbc.datasource.DataSourceTransactionManager 使用JDBC、MyBatis等基於數據源的持久化技術的事務管理類數組
org.springframework.orm.jdo.JdoTransactionManager 使用JDO進行持久化時,使用該事務管理器學習
org.springframework.transaction.jta.JtaTransactionManager 須要跨數據源時使用該事務管理類spa
PROPAGATION_REQUIRED 若是當前沒有事務,就建立一個事務,若是已經存在一個事務中。就加入這個事務hibernate
PROPAGATION_SUPPORTS 若是當前沒有事務就以非事務方式執行代理
PROPAGATION_MANDATORY 使用當前事務,若是沒有就拋出異常code
PROPAGATION_REQUIRES_NEW 新建事務,若是當前存在事務,就掛起當前事務orm
PROPAGATION_NOT_SUPPORTED 以非事務方式執行,若是當前存在事務,就掛起事事務
PROPAGATION_NEVER 以非事務方式執行,若是當前存在事務,就拋出異常
PROPAGATION_NESTED 若是當前存在事務,則在嵌套事務內執行。若是沒有,就執行PROPAGATION_REQUIRED相似的操做
傳統的Spring事務管理配置,通常根據不一樣持久化技術,先聲明一個DataSource,再聲明一個SessionFactory或EntityManagerFactory之類的工廠Bean引用DataSource(JDBC|MyBatis不須要),再聲明一個對應持久化技術的TransactionManager引用Factory或者DataSource。最後都使用org.springframework.transaction.intercepter.TransactionProxyFactory引用TransactionManager,建立代理
<bean id="proxy" class="org.springframework.transaction.intercepter.TransactionProxyFactoryBean" p:transactionManager-ref="p:transactionManager" p:target-ref="target"> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
如上所示,咱們能夠發現TransactionProxyFactoryBean其實就是根據指定類的靜態方法簽名匹配,爲代理類織入事務管理的代碼,Spring的事務管理其實就是對Spring AOP的一個很好的應用。
配置Spring事務管理和配置Spring AOP的切面實際上是同樣的固然也能夠使用tx/aop命名空間,有須要請自行學習
直接在須要加入事務的方法上面使用@Transactional註解,再在配置文件中加入<tx:annotation-driven transaction-manager="transactionManager"/>或者在配置類上加上@EnableTransactionManagement便可,固然@Transactional註解也能夠用在類上,類上表示類中的全部public的方法都會織入事務代碼。
@Transactional屬性以下:
propagation 設定事務傳播行爲,值爲Propagation的枚舉值
isolation 設置事務的隔離級別,值爲Isolation的枚舉值
readOnly 設置是否爲只讀事務,值爲boolean
timeout 設置超時時間,值爲int型,單位爲秒
rollbackFor 設定遇到時須要回滾的異常,值爲Class<? extends Exception>[]
rollbackForClassName 設定遇到時須要回滾的異常,值爲String[],異常名稱數組
noRollbackFor 設定遇到時不須要回滾的異常,值同上rollbackFor
noRollbackForClassName ......