spring 事务没有回滚

我是学习spring新手, 碰到spring事务没有回滚的问题, 希望知道原因的指教,不胜感激:

我在mysql里建了一个测试的admin表(innoDB 类型), 只有id一个字段(整形)。
4条数据:
id
1
2
3
4

配置文件:
[code="java"]
class="com.jandar.fdpweb.action.system.BranchOperationAction">


class="com.jandar.fdpweb.service.system.BranchManage">



class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">


    <property name="target">
        <ref local="branchDao"/>
    </property>

    <property name="transactionAttributes">
        <props>
            <prop key="deleteTest">PROPAGATION_REQUIRED, -Exception</prop>
        </props>
    </property>     

class="com.jandar.fdpweb.dao.jdbc.system.BranchDaoJdbcImpl">



class="org.springframework.jdbc.core.JdbcTemplate">



class="org.springframework.jdbc.datasource.DataSourceTransactionManager">





com.mysql.jdbc.Driver


jdbc:mysql://localhost:3306/cjr_test?characterEncoding=utf8


root


123456

10
5
20
5
60
0

[/code]

Struts Action 类:

[code="java"]
public class BranchOperationAction extends DispatchAction {

private BranchManage branchManage;

public BranchManage getBranchManage() {
    return branchManage;
}

public void setBranchManage(BranchManage branchManage) {
    this.branchManage = branchManage;
}

public ActionForward delete(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
{

        ActionForward forward = new ActionForward();
        DynaActionForm modifyForm = (DynaActionForm) form;          
        String branchId = modifyForm.getString("branch_tj").trim();
        branchManage.deleteTest(branchId);
        forward = mapping.findForward("success");
        return (forward);
}

}
[/code]

Server 类:

[code="java"]
public class BranchManage {
private BranchDao branchTransaction;

public BranchDao getBranchTransaction() {
    return branchTransaction;
}

public void setBranchTransaction(BranchDao branchTransaction) {
    this.branchTransaction = branchTransaction;
}

public void deleteTest(String branchId) {
    branchTransaction.deleteBranch(branchId);
}

}
[/code]

DAO 类:

[code="java"]
public interface BranchDao {
public void deleteBranch(final String branchId);
}

public class BranchDaoJdbcImpl implements BranchDao {
private JdbcTemplate jdbcTemplate;

public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}
public void deleteBranch(final String branchId) {
    String sqlDelete1 = "delete from admin where id = 1"; // 先删除一条记录
    int[] arr = {1, 2, 3, 4};   
    jdbcTemplate.update(sqlDelete1); 
            //我调试时, 程序运行这行后, 数据库居然删了一行, 事务这时应该没提交,不会删数据库才对啊, 是这样吗?
            //数组下标越界,想让程序抛出Runtime Exception  
    String sqlDelete2 = "delete from admin where id = " + arr[5]; 
    jdbcTemplate.update(sqlDelete2); // 删除第二条报错,事务没有回滚
}

}
[/code]

0

3个回答

你配置错误
你是针对dao来配置事务的
那自然就应该写成这样

PROPAGATION_REQUIRED, -Exception

0

你的c3p0DataSource数据源没有关闭默认自动提交吧。
增加

0

你的传播特性应该配置方法 正如2楼写的那样,spring的局部事务,实质是事务管理与aop的结合,它是通过factorybean的形式 取得它处理完的对象。在org.springframework.transaction.interceptor.TransactionProxyFactoryBean中,把你注入的



PROPAGATION_REQUIRED, -Exception



是通过
this.transactionInterceptor.setTransactionAttributeSource(transactionAttributeSource);实现的 也就是说 是把你传入的方法进行了aop的代理,才会在代码里横切进去事务的。你可以看看这段的源代码,会有很大收获的

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
你的Spring事务为什么不会自动回滚?
Spring的事务传播行为有七种,当前我说的是默认的那种。我们知道Spring的声明式事务是基于AOP的,那么就是AOP玩的又是代理对象,那你是不是就知道了,这个事务的大概实现原理了。。。 首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义: 1.在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时Runt...
Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚
在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:        ①在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;        ②RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;
架构师不得不知的Spring事务不能回滚的深层次原因
author: rocklei123 tags: Java Spring Spring Transaction categories: Spring date: 2018-09-18 17:19:20 1.目标 本文汇总了常见Spring事务无法回滚的问题,并配合实际案例模拟,并给出解决方案。通过本文可以更加详细的了解Spring事务无法回滚的原因。 希望大家手动敲一遍代码,会收获颇丰。...
Spring-事务有时候不能回滚分析
开头总述Spring在同一个类中调用function,事务会失效。Spring事务是基于AOP代理来实现的。而AOP是使用JDK动态代理来实现的。    例如:    /** * 父类调用子类 * 子类失败,不能影响父类 * * 预期效果:child回滚,parent插入成功 * 第一次试验 真实效果:都插入成功,child方法因为try catch导致事务未起作用。 *...
spring在service层的方法报错事务不会回滚
@Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception { // 业务代码1 business1(); // 业务代码2 business2(); // 业务代码3 business3(); } public void business1() { /...
spring事物回滚无效
错误情况1.    错误原因:spring没有扫描相应的类, 以前扫包都是在springmvc中直接这样扫了,就能够将testing下的controller和service那些都交给了spring,其实都是给了springmvc,根本没有给spring,所以spring完全无法添加事物,     解决方法: 后台springmvc中修改为      spring-mvc.xml:  ...
关于spring中事务不回滚的解决方式
关于spring中事务不回滚的问题,网上查了很多资料,基本有如下可能性: 假如我们把事务加到Service层: 1.Service层的方法我们try...catch了,导致AOP捕获不到异常. 所以事务控制失败.  解决方式: 不要在Service层try...catch即可.    或在catch块最后加上"throw new RuntimeException()".这样
Maven管理,SpringMVC+Spring+Mybatis环境整合
ps.本文旨在提供SSM环境整合的'资源文件配置'供大家参考,而并非一个完整教你一步步搭建一个SSM项目的博文。这是整合SpringMVC+Spring+Mybatis的小项目,Maven管理. 希望对大家有帮助,如有错误或疏漏的地方,请大家指出,在这里先谢谢了.ps.文中使用的jar包与配置文件,可能与大家实际开发项目情况有偏差,请自行判断修改. 1.目录结构这是本项目的目录结构. 各目录所放
Spring声明式事务不回滚问题
在使用Spring事务的时候我们经常使用注解@Transactional来声明事务,下面让我们来看一下Spring事务存在的坑。内部调用方法不会走代理方式调用,而是类内部的函数调用,有事务注解也不会开启事务,但是当A有事务调用B时,B会加入A事务中,使之为同一事务。解决方法:1,通过代理调用内部方法  2.自己注入自己调用,这样注入的就是代理对象了&quot;this对象:&quot;+this.getClass()...
Spring事务不回滚,原理分析以及解决方案
最近在做的项目和之前有点不一样,以前我们可能经常做后端的一直从Controller写到最终的持久层,当然这样的写法我也写了很久,中间转用restful风格,但是这种形式依然没有转变,这次项目结构和之前有所调整,所以在写着写着到最后自测的时候发现存在事务不会滚的情况,当时我就纳闷了,起初自我检查怀疑是我事务配置的有问题,但是最终发现我的配置是没有什么问题的(但是说有问题也是存在的,那就是切面的问题)
Spring添加了注解@Transactional事务不回滚总结
Spring加@Transactional事务不回滚 二、总结 1.首先你要确保你的配置文件正确,当然这个可能性很低,因为架构师都帮你弄好了(针对和当时的我一样的小白而言) 2.如果你的配置文件都正确,那么很有可能你执行数据库更新、插入的时候加了 try  catch 了,所以不
SpringBoot @Transactional 事务,运行异常进行事务回滚方法
直接上代码了: 1.首先需要在方法体上加上@Transactional表示支持事务 2.如果异常被抓起之后,需要回滚只能手动回滚,否则事务会认为异常已经被处理,就不在进行回滚     @Autowired     AcpgiftMapper acpgiftMapper;     @Transactional     public int tests() {         Acpgift e...
Springboot 事务回滚不生效问题
检查以下几点: 1.数据库是否为InnoDB引擎 2.配置文件中是否开启 transaction: rollback-on-commit-failure: true 3.是否在启动类中加入注解 @EnableTransactionManagement 4.测试问题: @Transactional注解必须和抛出异常的位置在一起 在Service中加入的事务注解,手动抛出异常时...
解决Spring的声明式事务中的自定义异常不回滚问题
@Transactional public void opreateAccount(int fromUserId, int toUserId, BigDecimal money) { System.out.println("转账开始!!"); try{ //根据id获取转出用户金额 BigDecimal fromaccount = userdao.getAccount(fro
Spring事务回滚条件
       在spring项目中,很多时候事务出现了异常,但是却没有回滚,导致数据库中产生脏数据。那位为什么明明出现了异常,事务却没有回滚呢,下面分析一下spring事务回滚的条件。        Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!        1、拦截的方法:             事务的控制方式有三种:             ...
Spring boot配置的事务失效,出现错误数据不回滚解决方案
修改mysql数据库表的引擎: alter table demo engine=innodb; 如果报innodb不能使用:     解决方法:         1.关闭MySQL数据库   2.修改my.ini文件,把skip-innodb这行注释掉;default-storage-engine改成INNODB(运行不了,就用默认的MYISAM)      3.打开MySQL数据库
Spring mvc+mybatis+mysql事物回滚不生效问题
    开始我打算在controller里面控制回滚,但尝试很多次无效,于是还是老实的在service里面控制事物回滚。    mysql需要表类型类为innoDB才行。有人说用mysql的话要关闭自动提交autocommit才行,我亲测不关也没问题。    不上不管开不开都可以正常回滚。    关于配置,注意点是spring-mvc中扫描注入时不要扫描service。原因是spring mvc扫...
Spring-test事务自动回滚
测试时使用save()方法向数据库插入一条记录,结果发现通过单元测试了,但是并没有向数据库插入一条记录,一看日志,发现Spring-test对事务进行了回滚。 为了使测试数据不对数据库造成污染,在使用Spring-test进行的单元测试的时候,默认会对事务进行回滚,即@Rollback 默认是true,如果想要测试数据不回滚,可设置@Rollback(value = false) 。如果是使用My
SpringMVC+Spring JdbcTemplate框架事务无法正常回滚
  applicationContext.xml将Controller的注解打消掉 &amp;lt;context:component-scan base-package=&quot;com.steven&quot;&amp;gt; &amp;lt;context:exclude-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Contr...
spring事务回滚(XML配置文件)
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:p=&quot;http://www.springframewor
mybatis集成spring的事务管理
第一 创建一个测试实体 [code=&quot;java&quot;] public class Order { private int id; private String orderName; public Order(String orderName) { this.orderName = orderName; } public int getId() { r...
spring事务异常回滚,不抛出事务失效
之前对于spring事务的理解一直错误的以为”在try捕获异常时开启事务,在catch块中回滚事务”:public void saveUser(User user){ try{ 事务开启 userDao.save(user) }catch(Exception e){ 事务回滚 } }或许是之前控制事务都是出于业务层,并且在捕获异常之后都有向
Spring 事务异常回滚
  先看如下代码     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { AppBizExeA.class } , noRollbackFor = { AppBizExeB.class }) public void method1() throws Exception { System.out....
springboot+mybatis事务无法回滚(解决)
在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用。 找到pom文件中有没有spr...
sql异常,Spring Aop事务不回滚解决方案
在做Spring声明式事务的时候,数据库连接池是HikariCP, 如果sql报错,比如某一个字段can’t be null, 这种sql exception就无法回滚,但是如果是1/0报错,事务就可以回滚,在网上查了很多资料,试了下面几个方法: 1. 检查mysql是否是innodb? 2. 自定义异常; 3. throw new RuntimeException(); 4. 在try ...
springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
一、知识点及问题后端框架: Spring 、Spring mvc 、mybatis业务需求: 客户端先从服务端获取用户大量信息到客户端,编辑完成之后统一Post至服务端,对于数据的修改要么全成功,要么全失败,所以需要使用事务支持。问题: 配置Spring声明式事务,执行中出现异常未回滚.从网上查询得到一开始是自己的配置出了问题,由于配置文件的加载顺序决定了容器的加载顺序导致Spring事务没有
spring+ mybatis 事务不能回滚问题解决
【2018年4月13号更新修改该说明】,之前我说自动扫描要精确到Controller就可以解决回滚问题,确实可以解决问题,自动装配的范围变小了,这样其他的Service层、dao层就不能自动装配了,这样肯定不合理。   原来Spring已经有相关的配置处理这个问题了,如果你项目不能回滚,肯定是把Controller层扫进去了,在application.xml文件中自动扫描配置新增&amp;lt;conte...
Spring jdbcTemplate之决不回滚解决方案
最近在学习spring,用到这个jdbcTemplate时发现他怎么都不回滚,就算用spring最开始的侵入式回滚都不好使,我蒙蔽了,一会弄明白了一定要写出来和大家分享,这个人性的jdbcTemplate
spring+mybatis声明式事务@Transaction无效抛出异常不回滚
测试代码如下: 抛出异常不回滚,百度无果,只好下载源码调试,开始对spring源码并不清楚,调试的时候也是晕头转向,经过两天的摸索算是有些初步了解. doGetResource每次都为null(见下图),因为null所以每次都会重新从连接池获取链接, 每次从连接池获取链接就不能保证两次获取的链接是同一个,不是同一个链接就不会支持事务回滚. 突破口就是resources.get()获取的map...
spring事务失效解决方法并进行事务的部分回滚
内容: 1.spring事务失效场景。 2.解决方案. 3.Spring事务回滚到指定片段。 场景描述: 当我们从12306点击最后一步付款操作,后台有两步操作。1.将乘客用户信息插入到订单表。2.向用户手机发送短信提示。 因为发送短信的方法需要掉外部网关,在这一步通常会发生发送失败。我希望当发送短信这个方法不影响我整体业务,即即使不发送短信车票订单同样向数据库中插入。 问题1:sp
记使用Junit单元测试事务无法回滚的问题(spring事务和断路器-Hystrix冲突)
在使用Junit的时间发现事务无法回滚,后来把Hystrix断路由删掉发现可以的,源码调式发现Hystrix和sqlsessionFactory使用的不是同一个contection,最后是将断路由的策略改成信号量(SEMAPHORE)解决的,目前没找到断路由线程池(THREAD)策略和Junit事务共存的办法。综合上述,配置改为如下即可解决:hystrix.command.default.exec...
Spring @Transaction配置示例及发生不回滚原因深度剖析
背景 最近在公司做的一个项目,用的是SpringMVC框架,数据库用的是MySql,刚开始并没有加入事务,其实主要原因是本人没有使用过SpringMVC的事务。 问题的产生和解决 使用事务,直接问百度,我选择的是注解的方式。 在配置文件中配置事务管理器和驱动: <bean id="transactionManager"
Spring MVC @Transactional注解方式事务无法回滚原因及解决方案
近期在做一个接口,采用的是Spring MVC的框架写的,但是当配置好框架,写完方法之后,发现在service层加了@Transactional注解的方式,竟然无效,无法进行事务的回滚,发现一般问题都不存在,一般@Transactional注解了,事务无法回滚是因为三个原因: 1.方法可能不是public的声明 2.异常类型是不是unchecked异常 这个说明一下,在@Transactio...
[踩过的坑]spring事务为什么不回滚!
本来只是想看看mysql插入数据时如果违反唯一约束,spring注解事务是否能回滚,因为粗浅的认为sql异常是check exception,不是runtime的,所以不给回滚,后来一通查找,发现唯一约束异常不属于sql的,而是spring封装dao的runtime,于是试了下,发现居然不能回滚!接着又在事务注解显示声明唯一约束异常回滚,发现还是不行! 突然怀疑自己工程的所有事务失效了orz
Spring事务异常回滚,捕获异常不抛出就不会回滚
下面这种情况,使用了catch捕获了异常,spring事务不会发生回滚 try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Exception e) { logger.info("能力开通接口,开户异常,异常信息:"+e); }  默认spring事务只在发生未被捕获
spring中事务@Transactional失效,不回滚
我在spring中使用@Transactional标注后,发现并没有效果,多方求解最终找出原因。以下是一些使用此标签的注意事项,如果不按这些规矩来就会失效: 1、在Spring启动项中开启事务 @EnableTransactionManagement 2、@Transactional只作用于public方法上,如果方法是private等其他作用域就不起作用 3、如果@Transaction...
Spring 中事务回滚失败
原因一:在业务层捕捉异常,在业务层手工捕捉并处理了异常(try..catch)等于把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。推荐做法是在业务层统一抛出异常,然后在控制层统一处理。 如果需要在业务层增加try..catch 时 ,可以在 catch中增加TransactionAspectSupport.currentTransactionStatus().setRol...
Springboot中声明事务@Transactional,为何有时候声明了事务报异常数据却不会回滚
@Transactional 这个注解相信大家都不陌生,这是事务的注解,什么是事务,无非就是未保证数据一致性,当出现任何异常时候出现数据回滚 注解是是不需要写提交事务的。 那么,最近我发现,这个@Transactional的注解,并不是所有异常都可以进行数据回滚,他只有是RuntimeException类及其子类(中文称为:运行时异常/unchecked异常/未检异常)异常的时候才会进行数据...
spring 事务应用误区总结:那些导致事务不回滚的坑
基于JDBC的 Spring事务在项目中常用来保证数据的一致性, 想要正确的使用,绝不是加一个@Transactional那么简单。最近团队内在排查事务不生效的问题时,就遇到了一个很典型的错误应用的场景。本文就几个容易遇到的导致事务不生效的场景做个总结。一、Spring事务原理在使用JDBC事务操作数据库时,流程如下:1//获取连接 21.Connection con = DriverManag...
关于Spring的@Transactional注解失效以及事务无法回滚问题
关于Spring的@Transactional注解失效以及事务无法回滚问题@Transactional失效问题最近写的项目中需要一个service中的部分事务执行完就被commit,但是部分service需要失败回滚。因此写在一个大的service中并且加上@Transactional显然是无法满足需求的。 因此这是需要把原先的一个service服务拆分,如原先的serviceA被拆分成servic