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 In Action 随书源码

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

    Spring认证考试流程

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

    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