调用webservice接口,数据不回滚问题 使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声明式事务管理还是使用
调用webservice接口,数据不回滚问题
使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声明式事务管理还是使用了使用@Transactional注解声明式事务管理,数据均不会回滚;在debug代码和查询相关资料后,个人觉得数据不会回滚的原因:调用webservice接口时,发生的异常并没有在service被spring捕获到,而是直接抛出给调用接口的客户端,所以就没有回滚。这时候就需要在抛出异常的地方手动回滚事务。手动回滚事务原理
org.springframework.transaction.support.TransactionTemplate:可以在service层方法中添加事务,Spring为我们提供了一种方法就是使用TransactionTemplate类;我们要为TransactionTemplate装配一个TransactionManager,调用TransactionTemplate实例的execute()方法将执行包含在TransactionCallback实例里的代码。如果代码出现异常,调用TransactionStatus对象的setRollbackOnly()将事务回滚。否则,如果doInTransaction()方法 正常返回,事务将被提交。手动回滚事务相关代码实现
xml文件配置
<!-- **************下面为事务控制相关配置: 手动方式******************** --> <!-- JDBC事务管理器 注意:事务管理器传的参数是数据源--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" scope="singleton" > <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <!-- 声明事务模板 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> </bean>
java代码
/* * 注入声明式事物模板 */ @Resource private JdbcDbDAO pubjdbcDAO; @Resource private TransactionTemplate transactionTemplate; public String SavePhysicianOrder(final String zyid,final String yzsllx,final String DATA_BUSINESS) { // TODO Auto-generated method stub //开始事务,如果出现状况则回滚 String execute = transactionTemplate.execute(new TransactionCallback<String>() { String jsonStr="";//返回值 @Override public String doInTransaction(TransactionStatus ts) { try { // 使用JdbcTemplate进行持久化层操作 String delSQL="DELETE FROM ZYGL_YZMXB";//封装好的JdbcTemplate int exeRnt=pubjdbcDAO.execSQL(delSQL);//封装J好的dbcTemplate if(exeRnt <= 0){ jsonStr="操作失败!!"; }else{ jsonStr="操作成功!!"; } } catch (Exception e) { ts.setRollbackOnly(); jsonStr="数据发生异常,异常信息:"+e.getLocalizedMessage(); return jsonStr; } // 如果成功,事务被提交 return jsonStr; } }); return execute; }