spring事务管理,不回滚,demo测试出bug(很简单demo,耽误大佬们,30s)

我做了一个demo来测试关于spring事务回滚的功能,运用的是Jdbctemplate来写的,很简单,注释也加了,就是不太清楚事务为什么不回滚?
代码如下:
applicationContext配置文件代码

 <?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd">


    <!--开始注释扫描-->
    <context:component-scan base-package="org.berg.demo5"/>

    <!-- 引入数据库连接属性配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:database.properties" />
    </bean>
    <!--使用dbcp的数据库的操作文件-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 连接池最大空闲 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="${minIdle}"></property>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- jdbc事务管理器 -->
    <bean id="txManager"   class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 2、注释模式事务:启动使用注解实现声明式事务管理的支持   -->
    <tx:annotation-driven transaction-manager="txManager" />
</beans>

DAO层代码

public class UserDaoImpl implements  UserDao {

    @Override
    @Transactional(rollbackFor=Exception.class)
    public void out(String outer, int money) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext4.xml");
        JdbcTemplate jdbcTemplate = (JdbcTemplate)context.getBean("jdbcTemplate");
        String usql = "update account set money  = money -"+money+" where username='"+outer+"'";
        jdbcTemplate.execute(usql);
    }

    @Override
    @Transactional(rollbackFor=Exception.class)
    public void in(String inner, int money) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext4.xml");
        JdbcTemplate jdbcTemplate = (JdbcTemplate)context.getBean("jdbcTemplate");
        String usql = "update account set money = money + "+money+" where username ='"+inner+"'";
        jdbcTemplate.execute(usql);
    }
}

Service层

    @Autowired
    private UserDao userDao;


    @Override
    @Transactional(rollbackFor=Exception.class)
    public void transfer(String outer, String inner, int money) {
            userDao.out(outer, money);
            int i=1/0;
            userDao.in(inner, money);
    }

Test代码

 public class Test {


    @Autowired
    AccountService accountService;

    @org.junit.Test
    public void Test(){
        ApplicationContext ss= new ClassPathXmlApplicationContext("classpath:applicationContext4.xml");
        AccountService as= (AccountService) ss.getBean("AccountServiceImpl");
        //Tom 向 Marry 转账1000
        as.transfer("Tom", "tony", 1000);   }
}

0

4个回答

数据库本身支持回滚吗?mysql的话要InnoDB才支持回滚

0

@Transactional注解事务不起作用的话有多种可能,

是否开启了对注解的解析,你已经写了 这个就pass了,
下一个数据库引擎要支持事务, 如果是mysql数据库的话,如果使用的是myisam,事务是不起作用的,可以改为innodb

0

应该还要配置切入点把。

0
qq_16127313
爱码少年 非AOP事务,无需配置切点
9 个月之前 回复

几点:
1. DAO 无需配置事务注解
2. 上下文无需重复手工加载

可以改成这样测试看看

@Repository
 public class UserDaoImpl implements  UserDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public void out(String outer, int money) {
        String usql = "update account set money  = money -"+money+" where username='"+outer+"'";
        jdbcTemplate.execute(usql);
    }

    @Override
    @Transactional(rollbackFor=Exception.class)
    public void in(String inner, int money) {         
        String usql = "update account set money = money + "+money+" where username ='"+inner+"'";
        jdbcTemplate.execute(usql);
    }
}

还有问题的话,可以跟我讨论.

回答完毕,希望帮到你!

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spring事务管理 junit回滚
源自:http://blog.csdn.net/funi16/article/details/8691575 在写单元测试的时候,一般是对数据库进行增删改查的操作,这个时候,如果之前删除了某条记录,自然后面的程序就找不到这条记录了,所以可以通过配置spring的事务管理或者测试框架来回滚,减少工作量。使用的数据库是postgreSQL和mysql。 在写这篇文章的时候,很多地方借鉴
springboot使用注解方式实现回滚
1.在实现增删改的时候只需在执行的方法上添加注解: @Transactional(propagation = Propagation.REQUIRED) eg: @Override @Transactional(propagation = Propagation.REQUIRED) public void is_order_taking(Order order) { orderMappe...
spring 声明式事务管理不能回滚解决办法
今天早上一个同事请教我一个问题。在他写的service中 数据库操作明明报出了exception可是事务不回滚。 刚开始以为是事务的嵌套操作引起的,可是把所有肯能的嵌套因素全部去掉之后还是不回滚。后来从网上找资料才发现错误: 他的事务声明所有的service里的方法都要做事务管理。我们在service方法里面对excepion做了处理。这样在struts里面调用service方法的...
实践中遇到Ibatis和spring整合事务不回滚的问题解决
今天早项目中遇到了如标题的问题,经过分析和查找,终于发现问题所在. spring和ibatis整合后的声明式事务本身没有问题,而是如果需要回滚的话,spring必须catch住runtime的异常,但是如果人为的去捕获了该异常再进行别的处理以后,则回滚不在处理....
Spring 声明式事务管理,捕获异常不抛出就不会回滚
  一个方法发生异常,另一个方法的事务是不会回滚的  if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Exception e) ...
Spring事务管理Demo
Spring事务管理Demo
Spring事务管理及几种简单的实现
事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,最为典型的就是银行转账的案例:A要向B转账,现在A,B各自账户中有1000元,A要给B转200元,那么这个转账就必须保证是一个事务,防止中途因为各种原因导致A账户资金减少而B账户资金未添加,或者B账户资金添加而A账户资金未减少,这样不是用户有损失就是银行有损失,为了保证转账前后的一致性就必须保证转账操作是一个事务。事务具有的ACID特性,参
SpringBoot 事务管理只异常不回滚的解决方案
处理springboot 下提交事务异常,数据库没有回滚的问题。 spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。 什么是检查型异常什么又是非检查型异常?最简单的判断点有两个:1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexc...
spring事务管理在mysql数据库无法回滚
检查了半天,配置和程序都没有问题,就是无法回滚数据。 最后才想起了mysql的数据表是有类型的MyISAM是非事务性表, 把它改成InnoDb类型都就OK了,唉,小失误废了我半天时间...
Spring事务管理(转账例子)
搭建转账环境 1、创建数据库,添加数据 2、 创建service和dao类,完成注入关系 (1)service层又叫业务逻辑层 (2)dao层,单纯对数据库操作层,在dao层不添加业务 (3)需求:Jerry 转账 300 给 Tom - Jerry 少 300 - Tom 多 300 详细代码,见下面   3、解决问题 (1)如果 Jerry
Spring声明式事务管理报异常事务不回滚
Spring声明式事务管理报异常事务不回滚 缘由:配置了一个新的ssh环境,数据库Mysql也是新的,在测试spring事务的过程中发现出现异常事务怎么都不回滚,网上查看很多大神指导,在此总结。 1、首先要确定的就是你的Mysql数据库引擎用的是哪一个,可以使用命令:Mysql&amp;gt;show engines 进行查看,MyISAM不支持数据回滚,InnoDB支持数据回滚,修改方式:停止数据库服务...
Spring事务之六(JUnit单测事务回滚)
更多文章:http://zhuqiuhui.space/ 测试代码 Case 1: 插入成功后会回滚 输出:insert :1 rows! Rolled back transaction after test execution for test context...... @Test @Transactional publ
解决Spring的声明式事务中的自定义异常不回滚问题
@Transactional public void opreateAccount(int fromUserId, int toUserId, BigDecimal money) { System.out.println("转账开始!!"); try{ //根据id获取转出用户金额 BigDecimal fromaccount = userdao.getAccount(fro
Spring boot +mybatis 实现声明式事务管理
在项目中,一个函数需要进行两条sql操作,两条sql操作为一个整体,期望是要不一起执行,要不都不执行,所以引入了事务管理。 遇到的问题&未解决的坑: 在一个@service实现了一个事务管理的函数,发现在另一个service里面添加此方法的@Autowired注解,事务管理失效 解决办法: 在@controller层调用此方法时添加   @Transactional
第一个spring声明式事务管理的例子
在applicationContext.xml中需要有一些基本配置                                                                                                                              
基于spring声明事务“不回滚”问题解决。
由于工作需要需要把数据保存不同的数据库表,如果某一环节出现问题对应表中数据都全部回滚,结果测试过程发现方法内报ApplicationException(自定义异常继承了Exception) 异常时b,c表数据都回滚,但是唯有a表所仍然提交了。相关事务定义也配置@Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(Retention...
java控制多线程里的事务回滚(事务方法中使用多线程)
【转载】:https://blog.csdn.net/szzssz/article/details/88694697 避免不了的要用到多线程,避免不了的要控制事务。突然需要在事务里用多线程。各种百度啊。 功能实现:多线程里或主线程里发生异常时 多线程和主线程里的事务都会回滚。并做了相应的测试代码 1 ...
Spring-test事务自动回滚
测试时使用save()方法向数据库插入一条记录,结果发现通过单元测试了,但是并没有向数据库插入一条记录,一看日志,发现Spring-test对事务进行了回滚。 为了使测试数据不对数据库造成污染,在使用Spring-test进行的单元测试的时候,默认会对事务进行回滚,即@Rollback 默认是true,如果想要测试数据不回滚,可设置@Rollback(value = false) 。如果是使用My
可拖拽排序的ListView(带侧滑删除)
可拖拽排序的ListView,并实现了侧滑删除,没有测试出BUG,请亲们帮着改进
spring事务管理,基于xml配置完成事务回滚;spring中数据库表中字段名和pojo中属性名不一致时候,实现RowMapper接口手动封装
声明使用JDK8,spring5.0.7, 测试说明: service 层 声明接口进行转账,从A转账B ,然后对AB 进行更新操作,在事务中对find方法开启 只读权限,无法进行更新操作,造成事务回滚进行测试事务; 主要测试方法: void tranfer(Long fromId , Long toId ,Double money); 数据库如下: 子工程结构; poj...
Spring boot事务管理只异常不回滚的解决方案
处理springboot 下提交事务异常,数据库没有回滚的问题。 spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。 什么是检查型异常什么又是非检查型异常? 最简单的判断点有两个: 1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runti
软件工程师解决测试人员测试出的bug流程
软件工程师在工作过程中,难免要解决软件中的各种bug,但是经常由于各种问题导致一个bug反反复复修改,甚至引出更多的bug。纠其原因,更多的是处理bug过程不规范导致的。笔者总结了工作中遇到bug的处理流程,如下:   一、bug确认 分配到一个bug后,要根据bug单号到bug管理系统查看该bug的详细信息。 1. 查看问题现象,了解问题 2. 查看软件版本和操作流程,检查当前版本和操作...
Spring事务不回滚,原理分析以及解决方案
最近在做的项目和之前有点不一样,以前我们可能经常做后端的一直从Controller写到最终的持久层,当然这样的写法我也写了很久,中间转用restful风格,但是这种形式依然没有转变,这次项目结构和之前有所调整,所以在写着写着到最后自测的时候发现存在事务不会滚的情况,当时我就纳闷了,起初自我检查怀疑是我事务配置的有问题,但是最终发现我的配置是没有什么问题的(但是说有问题也是存在的,那就是切面的问题)
SpringMVC 配置事务管理无效的原因及解决方案
一般我们在Spring的配置文件application.xml中对Service层代码配置事务管理,可以对Service的方法进行AOP增强或事务处理如事务回滚,但是遇到一个问题,在Controller类中调用Service层方法,配置的事务管理会失效,查询相关资料发现原因。其实Spring和SpringMVC俩个容器为父子关系,Spring为父容器,而SpringMVC为子容器。也就是说appl...
Spring声明式事务不回滚问题
在使用Spring事务的时候我们经常使用注解@Transactional来声明事务,下面让我们来看一下Spring事务存在的坑。内部调用方法不会走代理方式调用,而是类内部的函数调用,有事务注解也不会开启事务,但是当A有事务调用B时,B会加入A事务中,使之为同一事务。解决方法:1,通过代理调用内部方法  2.自己注入自己调用,这样注入的就是代理对象了&quot;this对象:&quot;+this.getClass()...
spring事务回滚2-测试
转载:http://blog.csdn.net/yipanbo/article/details/46048413最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志。但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚。  例:     类似这样的方法不会回滚 (...
springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
一、知识点及问题后端框架: Spring 、Spring mvc 、mybatis业务需求: 客户端先从服务端获取用户大量信息到客户端,编辑完成之后统一Post至服务端,对于数据的修改要么全成功,要么全失败,所以需要使用事务支持。问题: 配置Spring声明式事务,执行中出现异常未回滚.从网上查询得到一开始是自己的配置出了问题,由于配置文件的加载顺序决定了容器的加载顺序导致Spring事务没有
sql异常,Spring Aop事务不回滚解决方案
在做Spring声明式事务的时候,数据库连接池是HikariCP, 如果sql报错,比如某一个字段can’t be null, 这种sql exception就无法回滚,但是如果是1/0报错,事务就可以回滚,在网上查了很多资料,试了下面几个方法: 1. 检查mysql是否是innodb? 2. 自定义异常; 3. throw new RuntimeException(); 4. 在try ...
SpringBoot-Mybatis处理事务
SpringBoot+Mybatis简单的处理事务回滚
注意tips-spring事务控制默认回滚条件
默认事务回滚策略:throw RuntimeException 或者 Error。
Spring事务管理——回滚(rollback-for)控制
探讨Spring事务控制中,异常触发事务回滚原理。文章进行了6种情况下的Spring事务是否回滚。 以下代码都是基于Spring与Mybatis整合,使用Spring声明式事务配置事务方法。 1.不捕获异常(一般处理方式)代码,其中contentMappger.updateWithErrTest(31L); 是SQL语句错误,用来测试回滚。/** * 删除多条记录 */
关于Spring 声明式事务处理时,throws exception不回滚的问题
      前一段时间,项目代码评审,发现有TX不使用Spring的事务处理,而直接封装方法,手动进行数据的回滚,得悉原因是:抛出异常以后事务不起作用,没有回滚。这理由顿时让人很无语,不过还算个聪明的TX,知晓另辟蹊径,但是在insert的时候,手动回滚直接delete就可以了,如果是update,不晓得还会有什么更犀利的办法。       仔细评审代码细节,发现该TX压根没有按照框架原先设计在...
执行数据库'INSERT'操作时事务无法回滚
在使用Spring声明式事务的时候,发现在做”update”时,出现异常事务可以回滚,但是在执行”insert”的时候,后台日志虽然显示回滚了,但是数据却已经保存到了数据库中,本来以为是哪里配置出错了,后来却发现是Mysql存储引擎的的问题。我们用的Mysql版本是”5.1.73”,默认存储引擎是”MyISAM”。 查看mysql版本: mysql&amp;gt;...
事务处理的三种方式(简单小Demo)
概述:事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败.mysql.sqlcreate table account( id int primary key auto_increment, name varchar(20), money double ); insert into account values (null,'张三',10000);insert ...
springboot多数据源事务管理
springboot多数原配置与多事务管理
Jboss下使用spring配置实现JTA全局事务管理(上)
引言: 事务(Transaction)的实现能够保证一系列数据库等操作的原子性,即要么全部都成功,要么全部都失败。保证ACID特性在许多项目中尤其是联机交易、银行、电商等项目显得尤为重要。最近因项目要求,对事务进一步学习,以下是个人一些理解及部分代码。欢迎不吝赐教、指正。 单数据源事务: 1.JDBC事务 部分项目JDBC事务是通过代码层面实现,代码层面管理数据库连接,获取conn
spring事物管理,异常回滚,如果使用try catch进行捕获不抛出,事物不回滚
1.在今天测试代码的正确性,遇到了事物不进行回滚操作. 例子:(伪代码) 当第二个insert的时候,第一个方法没有进行回滚.(查询数据库,数据表有产品信息)   2.查询解答: 默认情况下spring事务只在发生未被捕获的 RuntimeException时才回滚(运行时异常) try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常...
Spring demo
spring bug demo,hehe
springboot事务失效的一种可能
springboot事务失效的一种可能情况 使用Springboot搭建web项目时,使用@Transactional注解进行事务管理,当service层方法没有使用public修饰时,事务处理将会失效: Dao层代码 package com.iotek.myspringboot.myspringboot; import org.springframework.data.jpa...
spring事务默认运行时异常回滚,RuntimeException
spring事务默认运行时异常回滚,RuntimeException 配置时添加异常回滚 rollback-for="Throwable"  expression="execution(* com.dctrain.service..*.*(..))" /> pointcut-ref="transactionPointcut" /> propa
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java大佬的学习经验 java大佬学习技术