java - spring transaction not working? -


hi try develop spring , hibernate app transactions , using spring 4.x , hibernate 4.x , here code snippet

applicationcontext.xml

<tx:annotation-driven />      <context:annotation-config />       <context:component-scan base-package="com.xyx.service" />      <context:component-scan base-package="com.xyz.dao" />       <import resource="conf/spring/persistence.xml" /> 

servlet-context.xml

<context:component-scan base-package="com.xyx.webservice.components" />      <mvc:annotation-driven />  <bean id="jsonmessageconverter" class="org.springframework.http.converter.json.mappingjackson2httpmessageconverter">     </bean>        <!--      configure plugin json request , response in method handler -->   <bean class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter">         <property name="messageconverters">             <list>                 <ref bean="jsonmessageconverter"/>             </list>         </property>     </bean>  

persistance.xml

<bean id="datasource"             class="org.springframework.jdbc.datasource.drivermanagerdatasource">             <property name="driverclassname" value="com.mysql.jdbc.driver" />             <property name="url" value="jdbc:mysql://localhost:3306/xyx" />             <property name="username" value="root" />             <property name="password" value="root" />       </bean>      <bean id="sessionfactory"           class="org.springframework.orm.hibernate4.localsessionfactorybean">         <property name="datasource">             <ref bean="datasource"/>         </property>         <property name="packagestoscan" value="com.xyz.model" />                <property name="hibernateproperties">             <props>                    <prop key="hibernate.dialect">org.hibernate.dialect.mysqldialect</prop>                   <prop key="hibernate.show_sql">true</prop>                              <prop key="hibernate.cache.use_second_level_cache">false</prop>                 </props>         </property>      </bean>      <bean id = "transactionmanager" class = "org.springframework.orm.hibernate4.hibernatetransactionmanager"   p:sessionfactory-ref= "sessionfactory" >     </bean>        </beans> 

and finnaly meservice

@transactional(propagation=propagation.required,rollbackfor=runtimeexception.class)     public object loadcategories(usercontactsinputvo inputvo) {          user user= getuserobject(inputvo);           userdao.saveorupdatefortrancasction(user);         system.out.println(user.getuserid());          //getaudiofilesbasedoncategories();         try{             return getaudiofilesbasedoncategories();         }catch (runtimeexception e) {             e.printstacktrace();         }         return new categoryresponsevo();     } 

and

@transactional(propagation=propagation.required)     public categoryresponsevo  getaudiofilesbasedoncategories()     {          try{             if(true)         throw new runtimeexception();          }finally{          }         return vo;      } 

here runtime exception occurs db records not rolled backed.

the reason transaction not getting rolled beacause runtimeexception not getting propagated actual spring proxy manages transaction rollback code. , reason not being propagated have caught , have not rethrown.

try{             return getaudiofilesbasedoncategories();         }catch (runtimeexception e) {             e.printstacktrace(); //**this wrong**         } 

instead this

 try{                 return getaudiofilesbasedoncategories();             }catch (runtimeexception e) {                 //log error                   throw e; // throw             } 

also not need give rollbackfor attribute default on runtimeexception, transaction rolled back.


Comments

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -