Spring時使用AOP來代理事務控制,針對接口和類,所以在同一個service類的兩個方法的調用,傳播機制不生效。
一、Spring事務隔離級別
1. ISOLATION_DEFAULT: 默認的隔離級別,使用數據庫默認的事務隔離級別。
2. ISOLATION_READ_UNCOMMITTED: 未提交讀,允許一個事務讀取另外一個事務未提交的數據,或造成臟讀、幻讀、不可重復讀。
3. ISOLATION_COMMITTED: 提交讀,保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。防止臟讀。
4. ISOLATION_RETETABLE_READ: 可重復讀,可以防止臟讀、不可重復讀,但是還會造成幻讀。
5. ISOLATION_SERIALIZABLE: 串行事務,事務串行執行,防止臟讀、不可重復讀、幻讀。
二、Spring事務傳播機制--參考鏈接--
(需要事務加入)
1. REQUIRED: 如果當前有事務就加入事務,如果沒有事務則創建一個新的。
2. REQUIRES_NEW: 創建一個新的事務,如果當前存在事務,則把當前事務掛起。
(嵌套事務)
3. NESTED: 如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行。如果沒有事務,相當於REQUIRED。
(支持,如果有就支持,如果沒有就算了)
4.SUPPORTS: 如果當前存在事務,則加入該事務。如果當前沒有事務,則以非事務的方式進行。
(不支持)
5. NOT_SUPPORTS: 以非事務方式運行。如果當前有事務,則把當前事務掛起。
(強制性的,一定要有,沒有就拋異常)
6. MANDATORY:如果當前存在事務,則運行在當前事務中。如果沒有事務,則拋出異常。
(從不,比NOT_SUPPORT更硬,直接異常)
7. NEVER: 以非事務方式運行,如果當前存在事務,則拋出異常,即父級方法必須無事務。
三、實現方式
1. 聲明式事務:@Transactional(propagation = Propagation.REQUIRED)
2. AOP實現事務
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dateSource"></property> </bean>
<tx:advice id="stockAdvice" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="by*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="MyExepction"/> <tx:method name="select*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"></tx:method> </tx:attributes
</tx:advice>
<aop:config> <aop:pointcut id="exAdvice" expression="execution(* *..service.*.*(..))"></aop:pointcut> <aop:advisor advice-ref="stockAdvice" pointcut-ref="exAdvice"></aop:advisor> </aop:config>
3. 事務代理工程Bean實現事務
<bean id="tproxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="dataSourceTransactionManager"></property><!–寫的是事務–> <property name="target" ref="byStockService"></property><!–要進行事務的類–> <property name="transactionAttributes"> <props>//key寫的是service層要增強的方法 事務的隔離級別,后面逗號后面是異常類,用於回滾數據–> <prop key="ByStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-MyExepction</prop> </props> </property> </bean>