0 0

spring mvc 事务失效问题15

同时向两个表插入数据,第一条成功,第二条数据插入失败,第一条未回滚,具体配置如下

 

applicationContext.xml 代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

 <!--将@Controller的注解排除掉 -->
 <context:component-scan base-package="com">
  <context:exclude-filter type="annotation"
   expression="org.springframework.stereotype.Controller" />
 </context:component-scan>

 <!-- 读取配置文件 -->
 <util:properties id="settings"
  location="classpath:config/global.properties" />

 <!-- 读取数据库配置文件 -->
 <bean id="configProperties"
  class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
   <list>
    <value>classpath:config/jdbc.properties</value>
   </list>
  </property>
 </bean>
 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
  <property name="properties" ref="configProperties" />
 </bean>
 <mvc:annotation-driven />

 <!-- 数据源 -->
 <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
  <property name="driver" value="${driver}" />
  <property name="driverUrl" value="${driverUrl}" />
  <property name="user" value="${user}" />
  <property name="password" value="${password}" />
  <property name="alias" value="proxool.aidecenter" />
  <property name="maximumActiveTime" value="300000" />
  <property name="prototypeCount" value="0" />
  <property name="maximumConnectionCount" value="${maximumConnectionCount}" />
  <property name="minimumConnectionCount" value="${minimumConnectionCount}" />
  <property name="simultaneousBuildThrottle" value="50" />
  <property name="houseKeepingTestSql" value="select form CURRENT_DATE" />
 </bean>
 <!-- JDBC模版 -->
 <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource" />
 </bean>
 <bean
  class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  <property name="staticMethod" value="com.common.database.SpringDB.setJdbcTemplate" />
  <property name="arguments" ref="jdbc" />
 </bean>
 <!-- 事务管理器 -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource">
   <ref local="dataSource" />
  </property>
 </bean>
 <!-- 事务模板 -->
 <bean id="transactionTemplate"
  class="org.springframework.transaction.support.TransactionTemplate">
  <property name="transactionManager">
   <ref local="transactionManager" />
  </property>
 </bean>
 <aop:config>
  <aop:pointcut id="transactionPointcut"
   expression="execution(* com.service..*.*(..))" />
  <aop:advisor pointcut-ref="transactionPointcut"
   advice-ref="advice" />
 </aop:config>
 <tx:advice id="advice" transaction-manager="transactionManager">
  <tx:attributes>
   <!-- 读取数据方法,一般采用只读事务 -->
   <tx:method name="find*" read-only="true" />
   <!--以下方法,如save,update,delete等对数据库进行写入操作的方法,当产生Exception时进行回滚 -->
   <tx:method name="save*" propagation="REQUIRED" />
   <tx:method name="update*" />
   <tx:method name="delete*" />
  </tx:attributes>
 </tx:advice>
 <tx:annotation-driven transaction-manager="transactionManager"
  proxy-target-class="true" />
</beans>

 

dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:cache="http://www.springframework.org/schema/cache" xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.1.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
            http://www.springframework.org/schema/jdbc 
            http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
            http://www.springframework.org/schema/cache
            http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
            http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"
 default-autowire="byName">

 <!-- 将@Service注解给去掉 -->
 <context:component-scan base-package="com.controller">
  <context:include-filter type="annotation"
   expression="org.springframework.stereotype.Controller" />
  <context:exclude-filter type="annotation"
   expression="org.springframework.stereotype.Service" />
 </context:component-scan>

 <bean
  class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
  <property name="useSuffixPatternMatch" value="true" />
  <property name="interceptors">
   <list>
    <ref bean="sessionInterceptor"></ref>
   </list>
  </property>
 </bean>

 <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
 <bean
  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="messageConverters">
   <list>
    <ref bean="mappingJacksonHttpMessageConverter" />
    <ref bean="stringHttpMessageConverter" />
   </list>
  </property>
 </bean>
 <!-- 负责读写字符串格式的数据 -->
 <bean id="stringHttpMessageConverter"
  class="org.springframework.http.converter.StringHttpMessageConverter">
  <property name="supportedMediaTypes">
   <list>
    <value>text/plain;charset=UTF-8</value>
   </list>
  </property>
 </bean>
 <!-- 负责读写入json格式的数据 -->
 <bean id="mappingJacksonHttpMessageConverter"
  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
  <property name="supportedMediaTypes">
   <list>
    <value>application/json;charset=UTF-8</value>
   </list>
  </property>
 </bean>

 <!-- 拦截器 -->
 <bean id="sessionInterceptor" class="com.interceptor.SessionInterceptor"></bean>

 <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="" />
  <property name="suffix" value=".jsp" />
 </bean>

 <!-- 启用缓存注解功能,该注解一定要声明在Spring主配置文件中才会生效 -->
 <cache:annotation-driven cache-manager="cacheManager" />
 <bean id="cacheManager"
  class="org.springframework.cache.concurrent.ConcurrentMapCacheManager" />

 <!-- 资源文件加载 -->
 <mvc:resources mapping="/upload/**" location="/upload/"
  cache-period="31556926" />
 <mvc:resources mapping="/libs/**" location="/libs/"
  cache-period="31556926" />
</beans>
上传的图片为包结构

 

Service的注解在接口实现类中

@Service
@Transactional
public class SiteServiceImpl implements SiteService {

.......

}

 

请问是哪里配置错了么


问题补充:上传附件为包结构

问题补充:实现类
package com.service.site.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.common.TableName;
import com.dao.BaseDao;
import com.service.site.SiteService;

@Service
@Transactional
public class SiteServiceImpl implements SiteService {

@Autowired
BaseDao baseDao;

@Override
public int saveSite(String tableName, Map<String, Object> map) throws Exception {
return baseDao.save(tableName, map, SiteServiceImpl.class);
}

@Override
public int updateSite(String tableName, Map<String, Object> updateMap, Map<String, Object> whereMap) throws Exception {
return baseDao.update(tableName, updateMap, whereMap, SiteServiceImpl.class);
}
}

问题补充:Controller类
package com.controller.site;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.common.Public;
import com.common.TableName;
import com.entity.site.Site;
import com.service.site.SiteService;
import com.service.systemmanage.FunctionMenuService;
import com.service.table.TableService;

@Controller
@RequestMapping(value = "/Site")
public class SiteController {

@Autowired
SiteService ss;

@Autowired
TableService ts;

@RequestMapping(value = "/addSite", method = RequestMethod.POST)
@ResponseBody
public int add(Site site) throws Throwable {
Map<String, Object> map = new HashMap<String, Object>();
map.put("site_id", Public.generalStandardId());
ss.saveSite(TableName.webissue_site_list, map); // 这个保存成功
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("id", Public.generalStandardId());
map1.put("name1", "aaa");
ts.saveTable("Table_1", map1); // 这个保存肯定失败
return 1;
}

}

问题补充:BaseDao实现类
package com.dao.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.common.database.SpringDB;
import com.dao.BaseDao;

@Repository
@Transactional
public class BaseDaoImpl extends SpringDB implements BaseDao {

/**
* 添加数据
*/
@Override
public <T> int save(String tableName, Map<String, Object> map, Class<T> clazz) throws Exception {
if (tableName != null && tableName.length() > 0) {
StringBuffer sql = new StringBuffer();
StringBuffer sql2 = new StringBuffer();
List<Object> params = new ArrayList<Object>();
sql.append("insert into " + tableName + " (");
for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) {
String colName = iterator.next();
Object colVal = map.get(colName);
if (iterator.hasNext()) {
sql.append(colName + ",");
sql2.append("?, ");
} else {
sql.append(colName + ") values(");
sql2.append("?)");
}
params.add(colVal);
}
return this.executeUpdate(sql.toString() + sql2.toString(), params.toArray(), clazz);
} else {
return -1;
}
}
}

问题补充:数据库连接
package com.common.database;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.JdbcTemplate;

public class SpringDB {

private static JdbcTemplate jdbc;

public static void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
SpringDB.jdbc = jdbcTemplate;
}

/**
* 增、删、改,类型为int
*
* @param sql
*           要执行的sql语句
* @param params
*           sql所对应的参数列表
* @param clazz
*           调用类
* @return 成功返回1,失败返回-1
*/
protected <T> int executeUpdate(String sql, Object[] params, Class<T> clazz) {
Logger log = Logger.getLogger(clazz);
//try {
return jdbc.update(sql, params);
//} catch (Exception e) {
// log.error(clazz + e.getMessage(), e);
// return -1;
//}
}
}

问题补充:com
  controller包
    site
      SiteController.java
  dao包
    impl
      BaseDaoImpl.java
    BaseDao.java
  service包
    site
      impl
        SiteServiceImpl.java
      SiteService.java
   
2014年6月30日 11:04
  • 大小: 106.3 KB

4个答案 按时间排序 按投票排序

0 0

采纳的答案

这个错误多明显啊,你事物定义到service包上面,然后你在controller包里调用了2个service去操作两张表。这俩个service的事物已经不在一个上下文里了。

Spring的事物是需要这样的。

@tran.....
public void doxx() {
dao.save(A表)
dao.delete(B表)
}

这样才能生效啊。

2014年7月01日 14:14
0 0

dispatcher-servlet.xml文件中

<!-- 将@Service注解给去掉 -->
<context:component-scan base-package="com.controller">

将base-package="com.controller"改为base-package="com"试试

只是猜测,未看到你controller的包结构

2014年6月30日 17:54
0 0

你把实现类具体内容上传一下啊,有可能问题就出现在代码里了。出现这种问题的原因有一个很难被发现,就是其中一个类没有被代理。先把代码贴上看看。

2014年6月30日 15:12
0 0

你看看Transactional引入对没,有可能是引入到其他包导致的。

2014年6月30日 12:09

相关推荐

    spring_mvc企业级框架精简版本,纯注解,绝对原创(最新版本,之前连接失效了)

    11. **AOP(面向切面编程)**:Spring MVC可以利用Spring的AOP支持实现日志记录、事务管理等跨切面的关注点。 12. **验证(Validation)**:Spring MVC可以配合JSR 303/349的Bean Validation进行数据校验,使用`@...

    spring杂谈 作者zhang KaiTao

    在Spring框架中,有多个关键知识点值得探讨。...总的来说,这些内容涵盖了Spring的多个重要方面,包括事务管理、AOP、IoC/DI、Bean后处理、MVC集成、数据绑定和扩展,为理解和应用Spring框架提供了深入的见解。

    Spring+SpringMVC配置事务管理无效原因及解决办法详解

    然而,在使用 Spring 和 SpringMVC 配置事务管理时,可能会遇到事务管理无效的问题。本文将详细介绍 Spring+SpringMVC 配置事务管理无效原因及解决办法。 事务管理在 Spring 中的重要性 在企业级应用程序中,事务...

    springMVC+hibernate+spring4.3 jar包整合

    在整合过程中,可能会遇到如版本兼容性问题、配置错误、事务管理失效等问题,需要仔细检查配置文件,查阅相关文档或社区资源来解决。同时,良好的日志记录和单元测试也能帮助排查问题。 总结来说,Spring MVC、...

    springMVC AOP拦截拦截Controller等实现日志管理

    通过这种方式,我们可以在Spring MVC中利用AOP实现对Controller方法的透明日志管理,不仅记录正常流程,也能捕获和记录异常,提升系统的可维护性和问题排查效率。 在实际项目中,我们可以根据需求进一步定制日志...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 ...

    Spring认证考试流程

    6. MVC(8%):考察Spring MVC框架的理解,包括控制器、视图解析和模型数据管理。 7. REST(6%):测试创建和使用RESTful服务的能力,包括HTTP方法、URI设计和响应处理。 8. JPA Spring Data(4%):涉及Spring Data...

    Spring In Action 随书源码

    源码的提供弥补了原书中下载链接失效的问题,使得读者能够更方便地实践和探索书中讲解的内容。 Spring框架是Java开发中的核心框架,它以依赖注入(Dependency Injection, DI)为核心,提供了面向切面编程(Aspect-...

    springmvc分布式.txt

    Spring MVC可以结合事务管理器来处理跨服务的事务一致性问题。 3. **故障恢复**:分布式系统中单个节点的故障可能会影响整个系统的可用性。Spring MVC可以通过集成重试机制和服务发现机制来增强系统的容错能力,...

    spring+cxf 实例项目

    这样,Spring容器可以自动管理Web服务实例,同时利用Spring的其他功能,如事务管理、AOP等。 接下来,项目中提到了Spring MVC,它是Spring框架的一个模块,用于构建Web应用程序。它提供了一个模型-视图-控制器(MVC...

    spring boot、eureka学习总结

    事务控制也是Spring Boot的一大亮点,它支持声明式事务管理,使开发者能方便地处理事务的一致性。 在Spring Boot中,我们可以使用Spring MVC来创建RESTful API,同时也可以返回JSP页面。返回JSP页面时,需要注意...

    Struts2+Spring3.0+Hibernate开发问题总结+知识讲解

    开发中常见的问题可能有Bean的生命周期管理、事务失效、AOP不生效等,这些问题通常需要检查Spring配置、Bean的定义和依赖关系。 3. **Hibernate**:Hibernate是一个ORM(对象关系映射)框架,它简化了数据库操作。...

    spring+struts+hibernate项目debug总结.rar

    常见的调试问题包括实体类的映射文件(hbm.xml)错误、SQL查询语句异常、事务管理失效等。使用Hibernate的show_sql属性可以帮助我们查看生成的SQL,通过对比实际数据库操作,找出问题所在。此外,还要注意N+1查询问题...

    Spring+Struts2+hibernate+Redis整合

    - 注意数据的一致性问题,合理设置缓存失效策略,避免脏读。 通过SSH+Redis的整合,可以构建出高并发、高性能的Java Web应用,充分利用Redis的内存优势,降低数据库压力,提升用户体验。在实际项目中,还需要根据...

    各种jar包的源码

    "各种jar包的源码"这个主题涵盖了几个著名的Java库,如Spring MVC、MyBatis以及一些相关的依赖库。这些源码对于开发者来说是宝贵的资源,可以帮助他们深入理解这些框架的内部机制,进行定制化开发或者优化代码。 ...

    hands-high-performance-spring-5

    - **缓存策略**: 掌握缓存的失效策略,避免缓存穿透和雪崩问题,提高系统稳定性。 4. **异步处理和任务调度** - **TaskExecutor与AsyncConfigurer**: 实现异步方法调用,提高系统并行处理能力,降低响应时间。 -...

    16.spring与springmvc常见面试题.docx

    我们在项目中可以只使用 Spring 一个框架,它就可以提供表现层的 MVC 框架,持久层的 Dao 框架。它的两大核心 IoC 和 AOP 更是为我们程序解耦和代码简洁易维护提供了支持。 4. Spring 常见创建对象的注解 答:@...

    Struts-Hibernate-Spring推荐的最优组合配置

    Struts在表现层提供MVC(Model-View-Controller)架构,Hibernate处理持久层对象与数据库之间的交互,而Spring则是一个全面的后端解决方案,涵盖了依赖注入、AOP(面向切面编程)、事务管理等多个方面。这三者结合...

    Spring.net中文版 html版 连接都可用

    这个"Spring.NET中文版 HTML版"是专门为中文用户准备的文档资源,解决了之前CHM格式文件中链接失效的问题,使得开发者能够更加方便地查阅和学习Spring.NET的相关知识。 1. **依赖注入(Dependency Injection, DI)*...

    Struts2.2.3 Spring3.0.5 Hibernate3.6.5 sql server整合实例源码呈现

    Struts2是基于MVC(Model-View-Controller)设计模式的开源Web应用框架,它解决了传统Struts1的一些问题,提供了更强大的控制结构和更丰富的拦截器。在Struts2.2.3版本中,你可以期待更好的性能和增强的可扩展性,...

Global site tag (gtag.js) - Google Analytics