文档章节

spring注解性的事物@Transactional不起作用

树上的风筝
 树上的风筝
发布于 2016/05/23 17:48
字数 1244
阅读 1088
收藏 7
点赞 2
评论 0

简介:事物的注解我们可以注解在类上也可以注解在方法上。默认事物的注解@Transactional(propagation=Propagation.REQUIRED,rollbackFor = {RuntimeException.class},timeout=30)这是默认的事物即你在类或者方法上注解@Transactional后默认会是上面的注解

propagation =Propagation.REQUIRED //默认事物传播行为

rollbackFor={RuntimeException.class}// 设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

一、首先保证你的配置事物的配置文件正确,我们的配置文件如下:

<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd"
        default-lazy-init="true">

    <description>Spring公共配置</description>
    <!-- MyBatis配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
        <property name="typeAliasesPackage" value="com.asiainfo.tfsPlatform.po" />
        <!-- 显式指定Mapper文件位置 -->
        <property name="mapperLocations" value="classpath*:/mapper/**/*Mapper.xml" />
    </bean>
    <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.asiainfo.tfsPlatform.mapper.**" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!-- <property name="annotationClass" value="com.asiainfo.tfsPlatform.repository.mybatis.MyBatisRepository"/> -->
    </bean>
    
        <!-- 开启事务注解驱动 -->  
    <tx:annotation-driven />  
     <!-- 事务管理器 -->  
    <bean id="transactionManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean> 
    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
    
    <!-- 定义aspectj -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>

    <!-- production环境 -->
    <beans profile="production">
        <context:property-placeholder ignore-resource-not-found="true"
            location="classpath*:/application-mybatis.properties" />    

        <!-- 数据源配置,使用应用内的Tomcat JDBC连接池 -->
        <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
            <!-- Connection Info -->
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="maxActive" value="${jdbc.pool.maxActive}" />
            <property name="maxIdle" value="${jdbc.pool.maxIdle}" />
            <property name="minIdle" value="0" />
            <property name="defaultAutoCommit" value="false" />
            <!-- 连接Idle10分钟后超时,每1分钟检查一次 -->
            <property name="timeBetweenEvictionRunsMillis" value="60000" />
            <property name="minEvictableIdleTimeMillis" value="600000" />
        </bean>
    </beans>
    
    <!-- local development环境 -->
    <beans profile="development">
        <context:property-placeholder ignore-resource-not-found="true"
            location="classpath*:/application-mybatis.properties,
                        classpath*:/application-mybatis.development.properties" />    

        <!-- Tomcat JDBC连接池 -->
        <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="defaultAutoCommit" value="false" />
        </bean>
    
    </beans>

    <!-- functional test环境 -->
    <beans profile="functional">
        <context:property-placeholder ignore-resource-not-found="true"
            location="classpath*:/application-mybatis.properties,
                        classpath*:/application.functional.properties,
                        classpath*:/application.functional-local.properties" />    
        
        <!-- Tomcat JDBC连接池 -->
        <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="defaultAutoCommit" value="false" />
        </bean>
    </beans>
    
    <!-- unit test环境 -->
    <beans profile="test">
        <context:property-placeholder ignore-resource-not-found="true"
            location="classpath*:/application-mybatis.properties,
                        classpath*:/application.test.properties" />    
        
        <!-- Spring Simple连接池 -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
            <property name="driverClass" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />    
        </bean>
    </beans>
</beans>

二、如果配置文件对了,类或者方法上注解了@Transaction 但是注解事物还是不起作用,批量提交后,不回滚,

解决方法一:不要对方法进行try{}catch(Exception e){}操作

解决方法二:如果对方法进行try{}catch(Exception e){    throw new RuntimeException("运行时出错!")} 一定要抛出运行异常。

三、下面是我功能测试代码:


    /**
     * 功能描述:汇总清单表数据到sp_stat_other表中
     * @author pankx
     * @date 2016年5月13日 上午10:48:42
     * @param  
     * @return void
     */
    @Transactional(propagation=Propagation.REQUIRED,rollbackFor = {RuntimeException.class, Exception.class})
    public boolean sumDataToSpstatother(String month) {
        //获取清单表汇总数据
        List<Map<String,Object>> spdata = null;
        try{
             spdata =countRecordByMonth(month);
             SpStatOther spStatOther =null;
            // int i=0;
                 
                 if(spdata!=null && spdata.size()>0){
                        for(Map<String,Object> data:spdata){
                             spStatOther = new SpStatOther();
                        /*    if(i==2){ 注释是测试事物的
                                spStatOther.setMonth(month);
                                spStatOther.setPartyId(data.get("PARTY_ID").toString());
                                //spStatOther.setSvcCode(SVC_CODE);
                                spStatOther.setSpServiceId(Long.valueOf(data.get("SP_SERVICE_ID").toString()));
                                spStatOther.setCallNum(Long.valueOf(data.get("CALL_NUM").toString()));
                                spStatOther.setDealDate(new Date());
                                spStatOtherMapper.insertSelective(spStatOther);
                            }else{*/
                                
                                spStatOther.setMonth(month);
                                spStatOther.setPartyId(data.get("PARTY_ID").toString());
                                spStatOther.setSvcCode(SVC_CODE);
                                spStatOther.setSpServiceId(Long.valueOf(data.get("SP_SERVICE_ID").toString()));
                                spStatOther.setCallNum(Long.valueOf(data.get("CALL_NUM").toString()));
                                spStatOther.setDealDate(new Date());
                                spStatOtherMapper.insertSelective(spStatOther);

                            /*}
                            i++;*/
                        }
                    }
                
             logger.info("[汇总] 数据汇总成功");
             return true;
        }catch(Exception e){
            e.printStackTrace();
            logger.info("[汇总] 数据汇总失败" );
            throw new RuntimeException("运行时出错!");
        }
    }

四、以下是spring配置事物要注意的

    

注意的几点:
1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
如下:
@Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
throw new Exception("注释");

}
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new Runt                

希望对大家有帮助!

© 著作权归作者所有

共有 人打赏支持
树上的风筝
粉丝 1
博文 37
码字总数 20210
作品 0
朝阳
程序员
Spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

一、注解式事务 1、注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo。 2、事务配置实例 (1)、spring+mybatis 事务配置 (2)、...

哲别0
04/20
0
0
springboot 中使用事物

直接在service 层的方法上加上@Transactional 注解就ok。 注意事项: 1、Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException及其子类)和 ...

为了美好的明天
01/12
3
0
事物注解 @Transactional

1、当标于类前时, 标示类中所有方法都进行事务处理 某些方法不需要事务时 事物传播行为 @Transactional(propagation=Propagation.REQUIRED) : 如果有事务, 那么加入事务, 没有的话新建一个(...

职业搬砖20年
07/11
0
0
Spring 使用注解方式进行事务管理

使用步骤: 步骤一、在spring配置文件中引入tx:命名空间 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="h......

binhu
2014/07/21
0
0
Spring 注解方式实现 事务管理

使用步骤: 步骤一、在spring配置文件中引入tx:命名空间 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="h......

北方攻城师
2014/08/10
0
0
spring mvc 事物失效

spring mvc 事物失效的原因: 各位侠士都知道,spring事物管理是一个很高大上的东西。 你需要首先了解的知识: 1 msyql 默认的MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文...

james_lz
2016/10/25
9
0
从构建分布式秒杀系统聊聊Lock锁使用中的坑

前言 在单体架构的秒杀活动中,为了减轻DB层的压力,这里我们采用了Lock锁来实现秒杀用户排队抢购。然而很不幸的是尽管使用了锁,但是测试过程中仍然会超卖,执行了N多次发现依然有问题。输出...

小柒2012
05/30
0
0
Spring AOP 对Spring MVC的Controller切面拦截不起作用

当使用Spring AOP对Controller层的Controller类的方法进行切面拦截,不起作用。AOP配置没有任何问题。 Spring AOP配置没有任何问题;【正常】 断点调试:Spring源码断点调试,在调用Control...

陶邦仁
2015/11/02
0
2
Spring事务——Spring 2.X的事务配置策略

Spring 2.X的事务配置策略 虽然前面介绍的TransactionProxyFactoryBean配置策略简单易懂,但配置起来极为麻烦:每个目标Bean都需要配置一个TransactionProxyFactoryBean代理,这种方式将导致...

摆渡者
2014/03/27
0
0
Spring中的@Transactional(rollbackFor = Exception.class)属性详解

序言 今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法; 异常 如下图所示,我们都知道Exception分为运行时异...

村里唯一的架构师
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

www.w3.org被qiang导致logback报错:Connect reset

web项目部署到tomcat后,web项目中的logback不能运行,报错信息如下: Reported exception: ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while parsing xml file......

浮躁的码农
15分钟前
0
0
JDeveloper中文乱码解决

全局设置字体; 全局设置环境编码; 项目设置编译器环境编码。

wffger
43分钟前
1
0
MySQL主从介绍 , 准备工作,配置主,配置从, 测试主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

TaoXu
今天
1
0
线性代数学习总结

亭子happy
今天
1
0
Java8:Lambda表达式增强版Comparator和排序

1、概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是...

孟飞阳
今天
0
0
从架构到组件,深挖istio如何连接、管理和保护微服务2.0?

近几年我一直从事于微服务系统的设计以及实现方面的工作,属于微服务架构一线实践者。之前做过一些单体系统的微服务改造,在微服务拆分、治理等方面都有一定的经验。 本人比较特殊一点的经历...

xiaomin0322
今天
1
0
基于vue的h5文件切片上传(获取文件md5,实现秒传、进度条实现)

template <button @click="file"></button><label ref="upload" style="position: relative;"> <input type="file" @change="selectFile" style="position: abs......

hkaikai
今天
1
0
Spring Boot 2.0 项目实现自同步AD域账号

在通过Spring Boot的自动化装配功能及JDK自带的LDAP模块,可通过如下几个简单步骤实现业务系统自动同步AD域账号功能。 1. Java自带ldap搜索域账号信息核心代码: try { LdapContext ctx...

B超
今天
1
0
Python----字符串中编码的问题

字符串中编码的问题 1、字符串前加 u 例:u"我是含有中文字符组成的字符串。" 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用...

android-key
今天
1
0
Tomcat8.0 + Redis 实现 Session 会话共享

由于项目需要,需要实现Tomcat8.0 + Redis 实现 Session 会话共享,以便于实现多应用集群。后参考了开源项目: https://github.com/jcoleman/tomcat-redis-session-manager 进行调整后实现该...

杨应滨
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部