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
Post a Comment