spring+springmvc+mybatis+shiro事务回滚失败

爬行的小马驹 爬行的小马驹 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
路过的大神们,我执行一个任务的时候的控制台log如下,抛了异常,但是数据库的数据没有回滚。
求赐教。

14:49:57.800 DEBUG org.apache.shiro.session.mgt.DefaultSessionManager - Unable to resolve session ID from SessionKey [org.apache.shiro.web.session.mgt.WebSessionKey@2853c097]. Returning null to indicate a session could not be found.
14:50:01.787 DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
14:50:01.841 DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26490db8]
14:50:02.146 DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@ff9bcb] will be managed by Spring
14:50:02.683 DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26490db8]
14:50:06.597 DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26490db8]
14:50:06.598 DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26490db8]
14:50:06.598 DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26490db8]
三月 22, 2017 2:50:06 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [springServlet] in context with path [/ws] threw exception [Request processing failed; nested exception is com.ydkj.common.exception.BusinessException: exception] with root cause
com.ydkj.common.exception.BusinessException: exception
at com.ydkj.product.article.service.impl.ArticlePraisesServiceImpl.saveArticlePraises(ArticlePraisesServiceImpl.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)


spring-context.xml文件内容
[code=text]
<!-- 使用Annotation自动注册Bean,解决事务失效问题:在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解。 -->
<context:component-scan base-package="com.ydkj">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

<!-- 加载配置属性文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath*:properties/webview.properties" />
<context:property-placeholder ignore-unresolvable="true" location="classpath*:properties/base_config.properties" />
<context:property-placeholder ignore-unresolvable="true" location="classpath*:properties/redis.properties" />
<!-- 数据源配置, 使用 Druid 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
<property name="driverClassName" value="${jdbc.driver}" />

<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${jdbc.pool.init}" />
<property name="minIdle" value="${jdbc.pool.minIdle}" />
<property name="maxActive" value="${jdbc.pool.maxActive}" />

<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />

<property name="validationQuery" value="${jdbc.testSql}" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />

<!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->

<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat" />
</bean>

<!-- Mybatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myP6DataSource" />
<property name="typeAliasesPackage" value="com.ydkj" />
<property name="mapperLocations" value="classpath:/mappings/**/*.xml" />
<property name="configLocation" value="classpath:/mybatis-config.xml" />
</bean>

<!-- 扫描basePackage下所有以 @MyBatisDao注解的接口注解的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.ydkj"/>
<property name="annotationClass" value="com.ydkj.common.persistence.annotation.MyBatisDao" />
</bean>

<!-- 配置SQLSession模板 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

<!-- 声明式事务管理 -->
<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="get*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="select*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="query*" read-only="true" propagation="SUPPORTS"/>
<!-- 开启新事务 -->
<tx:method name="error*" propagation="REQUIRES_NEW"/>
<tx:method name="*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* *..*ServiceImpl.*(..))||execution(* com.ydkj.*.service.*.*(..))||execution(* com.ydkj.*.*.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
</aop:config>

<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
<!-- 使用annotation注解方式配置事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<import resource="classpath*:spring-context-shiro.xml"/>
</beans>
spring-mvc.xml文件内容
[/code
<!-- 使用Annotation自动注册Bean,只扫描@Controller -->
<context:component-scan base-package="com.ydkj" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean class="com.ydkj.ws.Interceptor.SpringMVCInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.ydkj.ws.Interceptor.SpringMVCInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

<!--Spring3.1开始的注解 HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!--Spring3.1开始的注解 HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

<!-- 视图解释类 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="${web.view.prefix}" />
<property name="suffix" value="${web.view.suffix}" />
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>

<!-- 定义无Controller的path<->view直接映射 -->
<mvc:view-controller path="/ws" view-name="redirect:${web.view.index}"/>

<!-- 对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
<mvc:default-servlet-handler />
这个配置为啥事务不起作用。我在service实现类上都打了@service注解了。
...全文

相关推荐

毕业设计基于SSM+MySQL的汽车租赁管理系统源码+数据库

毕业设计基于SSM+MySQL的汽车租赁管理系统源码+数据库 本项目代码经过严格调试,确保可以运行!放心下载使用。可作为期末课程设计、课程大作业、毕业设计等。具有较高的学习借鉴价值!

云哲-吉吉2021

基于JSP+SSM的社区超市进销存购物商城系统开发实践

在Java Web开发领域,MVC设计模式是构建分层架构应用的核心思想,它通过分离模型、视图和控制器职责,实现了业务逻辑、数据展示和用户交互的解耦。其技术原理在于利用控制器接收请求、调用服务层处理业务、并通过数据访问层操作数据库,最终由视图层渲染结果。这种模式的技术价值在于提升了代码的可维护性、可测试性和团队协作效率。在工程实践中,结合Spring框架的IoC容器和事务管理,以及MyBatis的ORM映射,能够高效构建数据驱动的Web应用。典型的应用场景包括电商平台、内容管理系统和企业后台管理系统。本文聚焦

weixin_33851429

使用SSM+MySQL,实现简易的银行管理系统_源码.zip

使用SSM+MySQL,实现简易的银行管理系统_源码

mYlEaVeiSmVp

springmvc+spring+mybatis+druid+shiro 登陆实现

基于SSM + druid + shiro 实现最简单的登陆,登陆拦截、异常反馈 全程由shiro控制,URL:http://localhost:8080/wzx/user/login

康抗

ssm+shiro实现简单的登陆认证功能

ssm+shiro实现简单的登陆认证功能,简单明了,适合小白~

阿枫同学
评论 1
收藏 已收藏
分享
返回顶部