第一種:@Tancational注解開啟事務,注意這個注解只有方法public方法上才能有效
1)配置文件中配置事務管理器 <!--聲明事務管理器,在內部負責提交事務 commit() ,回滾事務 rollback()--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--必須使用的屬性數據源 DataSource,有了這個,我們才知道對那個數據庫進行事物操作--> <property name="dataSource" ref="myDataSource" /> </bean> <!--開啟事務注解驅動:告訴spring要支持@Transactional的使用--> <tx:annotation-driven transaction-manager="transactionManager" /> 2)在方法上加上@Trancational注解 @Transactional( propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ, timeout = 20, rollbackFor = {NullPointerException.class,NotEnoughException.class}) public void tranca(){}
第二種:使用AspectJ配置文件開啟事務
<!--1.聲明事務管理--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="myDataSource" /> </bean> <!--2.給相關方法添加上事務,advice其實就是通知,這里我們使用了aop面向切面--> <tx:advice id="myAdvic" transaction-manager="transactionManager"> <!-- tx:method:指定給方法的事務屬性 name:方法的名稱,業務方法的名稱(1.完整的方法名稱,不帶參數;2.使用通配符的方法名稱,通配符是*) isolation:隔離級別 propagation:傳播行為 rollback-for:發送異常時回滾。他的值是異常類的全限定名 --> <tx:attributes> <!--給一個具體的方法添加事務--> <tx:method name="buy" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.NullPointerException,com.wkcto.excep.NotEnoughException"/> <!--給所有方法添加事務--> <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRES_NEW" /> <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" /> <tx:method name="remove*" /> <!--其他方法 queryXXX, findXXX, searchXXX--> <tx:method name="*" propagation="SUPPORTS" isolation="DEFAULT" read-only="true" /> </tx:attributes> </tx:advice> <!--3.配置aop--> <aop:config> <!--設置切入點表達式:哪些類中的方法要使用事務 id:自定義的表達式名稱 expression:切入點表達式 execution(* *..service..*.*(..)):表示所有service類中的所有方法 --> <aop:pointcut id="servicePt" expression="execution(* *..service..*.*(..))"/> <!--配置增強器: 連接類和事務的方法 advice-ref: 通知的id; pointcut-ref:切入點表達式的id --> <aop:advisor advice-ref="myAdvic" pointcut-ref="servicePt" /> </aop:config>