spring 事物中遇到try catch 事物不会滚
Posted wululu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 事物中遇到try catch 事物不会滚相关的知识,希望对你有一定的参考价值。
依赖spring事物时,当service层进行try catch异常捕获时,事物不会产生回滚,
service层代码如下@Resource
TestDao testDao; public void insertMsg(ConversationBean conversationBean){ try{ for(int i=0;i<100;i++){ if(i!=10){ testDao.insert2(i); }else{ testDao.insert1(i); } } }catch(Exception e){
} }
此时异常被捕获,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获,导致spring异常抛出触发事务回滚策略失效。
解决此类问题时,需要在try catch中显示的抛出夜歌RuntimeException 然后在Controller层捕获异常并编写返回值
全部代码如下:
spring 配置
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="alias" value="StarshineWorkspacePool"></property><!--别名--> <property name="driver" value="oracle.jdbc.driver.OracleDriver"/><!--驱动--> <property name="driverUrl" value="${common.db.url}"/><!--地址--> <property name="delegateProperties" value="user=${common.db.username},password=${common.db.password}"/><!--用户密码--> <!--用户密码 szfwszwdt starshinegov--> <!-- starshinegov szfwszwdt --> <property name="user" value=""/><!--无需填写但必须存在--> <property name="password" value=""/><!--无需填写但必须存在--> <property name="minimumConnectionCount" value="10"/><!--最小连接数 默认2--> <property name="maximumConnectionCount" value="100"/><!--最大连接数 默认5--> <property name="maximumActiveTime" value="1800000"/><!--检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程(毫秒)--> <property name="houseKeepingSleepTime" value="10000"/><!--侦察(自动)到空闲的连接就马上回收,超时的销毁(毫秒) 默认30秒--> <property name="prototypeCount" value="1"/><!--最少保持的空闲连接数 默认2--> <property name="simultaneousBuildThrottle" value="10"/><!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--> <property name="maximumConnectionLifetime" value="14400000"/><!--连接最大生命时间 默认4小时--> <property name="houseKeepingTestSql" value="SELECT CURRENT_DATE FROM DUAL"/><!--用于保持连接的测试语句--> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean>
<!-- 开启AOP监听 只对当前配置文件有效 --> <aop:aspectj-autoproxy expose-proxy="true" /> <!-- 开启注解事务 只对当前配置文件有效 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!--事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="send*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="login*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="submit*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="execute*" propagation="REQUIRED" /> <tx:method name="destroy*" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config expose-proxy="true"> <aop:pointcut id="txPointcut" expression="execution(* cn.com.wunvnv..service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> </aop:config>
service 层代码
@Resource TestDao testDao; public void insertMsg(ConversationBean conversationBean){ try{ for(int i=0;i<100;i++){ if(i!=10){ testDao.insert2(i); }else{ testDao.insert1(i); } } }catch(Exception e){ throw new RuntimeException(); }
controller层代码
@ResponseBody @RequestMapping(value="/acceptMessage",method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public InterfaceResult acceptMessage(@RequestBody ConversationBean conversationBean) { try{ acceptService.insertMsg(conversationBean); return InterfaceResult.successInterfaceResult(); }catch(Exception e){ return InterfaceResult.failedInterfaceResult("失败", "100"); } }
以上是关于spring 事物中遇到try catch 事物不会滚的主要内容,如果未能解决你的问题,请参考以下文章
spring事务管理中,用try-catch处理了异常,事务也会回滚?
spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)