侵入代碼式 的事務 管理

在spring aop 事務管理中發現,咱們是在service層實現的事務管理。 
如今有以下場景,你們討論下看如何實現? 
ControllerA、ControllerB、ControllerC….共同依賴ServiceA、ServiceB,上述Controller的save操做須要把數據同步ServiceA和ServiceB。 
因爲每一個Controller保存ServiceB的extraData字段是經過Json組裝的,因此每一個Controller具備獨特性。若是在Service層實現事務管理,ServiceA將會變的異常龐大,須要判斷是哪一個Controller過來的數據,而後組裝ServiceB的extraData字段。 
另外一種思路,咱們是否能夠把每一個Controller組裝ServiceB的extraData字段過程放在各自的Controller,而後在Controller實現事務管理呢? 
通過測試,在Controller層加事務,在spring.xml的aop:config添加對Controller的聲明式事務攔截,結果未生效。在Controller的class加上@Transactional也未生效。最後採起的編程式事務實現的。 
咱們在Spring.xml配置sessionFactory和transactionManager,若是已經配置聲明式事務,這步能夠忽略。java

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="c3p0DataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">#{ nplat['db.dialect'] }</prop> <prop key="hibernate.hbm2ddl.auto">none</prop> <prop key="hibernate.connection.release_mode">after_transaction</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.max_fetch_depth">3</prop><!-- 抓取的級聯深度 --> <prop key="hibernate.jdbc.fetch_size">50</prop><!-- 批量抓取的數量.mysql不支持 --> <prop key="hibernate.jdbc.batch_size">30</prop><!-- 批量寫入的數量 --> <prop key="javax.persistence.validation.mode">none</prop><!-- HiberV3.5以上需配置該項 --> <!-- <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 強制Hibernate以更人性化的格式將數據存入二級緩存 <prop key="hibernate.cache.use_structured_entries">true</prop> --> </props> </property> <property name="packagesToScan"> <list> <value>com.gina.gc</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>

 

 

而後在每一個Controller注入transactionManager:mysql

@Resource private PlatformTransactionManager transactionManager;

下面講解如何在Controller的save方法加上編程式事務:spring

@RequestMapping("/save") @ResponseBody public String save(@Validated BaseSetting info) { DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition(); defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition); try { serviceA.save(A); serviceB.save(B); ... transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); e.printStackTrace(); log.error("sava *** error" + e.toString()); return ERROR(e.toString()); } return OK(); }

這樣咱們便實現了在Controller層加上事務管理。 
雖然說你們建議把事務加在Service,但不一樣狀況不一樣處理方案,真正到項目中還得綜合考慮,靈活運用。sql

相關文章
相關標籤/搜索