<!-- transationManager --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- advice --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="select*" propagation="SUPPORTS" read-only="true"/> <tx:method name="*" rollback-for="java.lang.Exception" timeout="100" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <aop:pointcut id="interceptorPointCuts" expression="execution(public * com.bai.du.*.service.impl.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>
這里統一規定了service實現類中與事務有關的方法的命名規則,比如新增方法,方法名必須以insert開頭;刪除方法,方法名必須以delete開頭;更新方法,方法名必須以update開頭,查詢方法必須以select開頭,以什么開頭或結尾這可以自定義,只有這樣方法才能被spring的事務管理,為什么要在service層配置事務呢?這是因為service中定義的是業務操作(比如存取款),而這個業務操作可能需要多次操作數據庫,為防止操作數據庫過程中可能會出現部分成功,部分失敗的情況,所以把事務放在service層,這樣只有數據庫操作全部成功(不報異常),整個事務才會提交。
上面是采用xml配置事務,這樣的好處是僅此一處配置,便可實現所有匹配的事務,事務配置與代碼高度分離,缺點是需要遵循定義的命名規則,還有一種方法就是使用注解,只需要在xml文件中增加:
<tx:annotation-driven transaction-manager="transactionManager"/>
並且在需要事務管理的方法上添加@Transactional()注解(注意是spring包的),()中同樣可以定義propagation,read-only,rollback-for等屬性。注解的優勢是配置比較靈活,xml文件中配置比較簡潔,缺點是需要的地方就必須添加注解,比較繁瑣,而且還增加代碼的耦合。建議使用xml配置方式。