事務管理器以普通的Bean形式聲明在SpringIOC容器中。java
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:advice id="bookShopTxAdvice" transaction-manager="transactionManager"></tx:advice> <aop:config> <aop:pointcut id="bookShopOperation" expression="execution(* *.BookShopService.*(..))"></aop:pointcut> <aop:advisor advice-ref="bookShopTxAdvice" pointcut-ref="bookShopOperation"/> </aop:config>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <context:component-scan base-package="com.desparado.service"></context:component-scan> <tx:annotation-driven/>
傳播屬性 | 描述 |
---|---|
REQUIRED | 若是有事務在運行,當前的方法就在這個事務內部運行,不然,就啓動一個新的事務,並在本身的事務內運行。 |
REQUIRED_NEW | 當前的方法必須啓動新事務,並在它本身的事務內運行,若是有事務正在運行,應該將它掛起 |
SUPPORTS | 若是有事務在運行,當前的方法就在這個事務內運行,不然它能夠不容許在事務中 |
NOT_SUPPORTED | 當前的方法不該該運行在事務中,若是有運行的事務,將它掛起 |
MANDATORY | 當期的方法必須運行在事務內部,若是沒沒有正在運行的事務,就拋出異常 |
NEVER | 當前的方法不該該運行在事務中,若是有運行的事務,就跑出異常 |
NESTED | 若是有事務在運行,當前的方法就應該在這個事務的嵌套事務內運行,不然,就啓動一個新的事務,並在它本身的事務內運行 |
@Transactional(propagation=Propagation.REQUIRES_NEW)
在xml中能夠在
<tx:advice id="bookShopTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="purchase" propagation="REQUIRES_NEW"/> </tx:attributes> </tx:advice>
@Transactional(propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED)
<tx:advice id="bookShopTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="purchase" propagation="REQUIRES_NEW" isolation="READ_COMMITTED"/> </tx:attributes> </tx:advice>
事務的回滾規則能夠經過@Transactional註解的rollbackFor和noRollbackFor屬性來定義,這兩個屬性被聲明爲Class[]類型的,所以能夠爲這兩個屬性指定多個異常類。
- rollbackFor:遇到時必須進行回滾。
- noRollbackFor:一組異常類,遇到時必須不會滾sql
@Transactional(propagation=Propagation.REQUIRED_NEW, isolation=Isolation.READ_COMMITTED, rollbackFor=(IOException.class,SQLException.class), noRollbackFor=ArithmeticException.class) public void purchase(String isbn,String username){}
<tx:advice id="bookShopTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="purchase" propagation="REQUIRES_NEW" isolation="READ_COMMITTED" rollback-for="java.io.IOException,java.sql.SQLException" no-rollback-for="java.lang,ArithmeticException"/> </tx:attributes> </tx:advice>
@Transactional(propagation=Propagation.REQUIRED_NEW, isolation=Isolation.READ_COMMITTED, rollbackFor=(IOException.class,SQLException.class), noRollbackFor=ArithmeticException.class, readOnly=true,tomeout=30) public void purchase(String isbn,String username){}
-在Spring 2.x事務通知中,超時和只讀屬性能夠在
<tx:advice id="bookShopTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="purchase" propagation="REQUIRES_NEW" isolation="READ_COMMITTED" rollback-for="java.io.IOException,java.sql.SQLException" no-rollback-for="java.lang,ArithmeticException" read-only=true timeout=30/> </tx:attributes> </tx:advice>