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玩的又是代理对象,那你是不是就知道了,这个事务的大概实现原理了。。。nn首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:nnnn1.在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时Runt...
Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚
在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:nn       ①在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;nn       ②RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;
Spring-事务有时候不能回滚分析
开头总述Spring在同一个类中调用function,事务会失效。Spring事务是基于AOP代理来实现的。而AOP是使用JDK动态代理来实现的。    例如:    /**n * 父类调用子类n * 子类失败,不能影响父类n * n * 预期效果:child回滚,parent插入成功n * 第一次试验 真实效果:都插入成功,child方法因为try catch导致事务未起作用。n *...
架构师不得不知的Spring事务不能回滚的深层次原因
nauthor: rocklei123ntags:nnJavanSpringnSpring Transactionncategories: Springndate: 2018-09-18 17:19:20nnn1.目标nn本文汇总了常见Spring事务无法回滚的问题,并配合实际案例模拟,并给出解决方案。通过本文可以更加详细的了解Spring事务无法回滚的原因。n希望大家手动敲一遍代码,会收获颇丰。...
关于spring中事务不回滚的解决方式
关于spring中事务不回滚的问题,网上查了很多资料,基本有如下可能性:rnrnrn假如我们把事务加到Service层:rnrnrn1.Service层的方法我们try...catch了,导致AOP捕获不到异常. 所以事务控制失败. rn解决方式: 不要在Service层try...catch即可. rn  或在catch块最后加上"throw new RuntimeException()".这样
Spring声明式事务不回滚问题
在使用Spring事务的时候我们经常使用注解@Transactional来声明事务,下面让我们来看一下Spring事务存在的坑。内部调用方法不会走代理方式调用,而是类内部的函数调用,有事务注解也不会开启事务,但是当A有事务调用B时,B会加入A事务中,使之为同一事务。解决方法:1,通过代理调用内部方法  2.自己注入自己调用,这样注入的就是代理对象了&quot;this对象:&quot;+this.getClass()...
Spring事务不回滚,原理分析以及解决方案
最近在做的项目和之前有点不一样,以前我们可能经常做后端的一直从Controller写到最终的持久层,当然这样的写法我也写了很久,中间转用restful风格,但是这种形式依然没有转变,这次项目结构和之前有所调整,所以在写着写着到最后自测的时候发现存在事务不会滚的情况,当时我就纳闷了,起初自我检查怀疑是我事务配置的有问题,但是最终发现我的配置是没有什么问题的(但是说有问题也是存在的,那就是切面的问题)
spring事物回滚无效
错误情况1.nn   错误原因:spring没有扫描相应的类,nn以前扫包都是在springmvc中直接这样扫了,就能够将testing下的controller和service那些都交给了spring,其实都是给了springmvc,根本没有给spring,所以spring完全无法添加事物,nnnn    解决方法: 后台springmvc中修改为nn     spring-mvc.xml:nn ...
Spring事务管理,"'程序报错'但'事务不回滚'?"问题分析(SSM实例)
Spring事务管理,是经常能应用到的一个功能,但是有时候会有'事务不回滚'的情况发生,那么我们来看看,什么情况下,事务真的不会回滚呢?n本文后段还有SSM的事务管理配置实例,供大家学习参考n就我现在遇见的坑来说,’报错不回滚’有两个原因: n1.不清楚什么样的报错才会回滚(理解错误). n2.配置文件错误或者不完整(配置错误).
springboot事务失效的一种可能
springboot事务失效的一种可能情况nn使用Springboot搭建web项目时,使用@Transactional注解进行事务管理,当service层方法没有使用public修饰时,事务处理将会失效:nnnnnnDao层代码nnnnpackage com.iotek.myspringboot.myspringboot;nnimport org.springframework.data.jpa...
Spring boot配置的事务失效,出现错误数据不回滚解决方案
修改mysql数据库表的引擎: alter table demo engine=innodb;rn如果报innodb不能使用:rn    解决方法:rn        1.关闭MySQL数据库rn  2.修改my.ini文件,把skip-innodb这行注释掉;default-storage-engine改成INNODB(运行不了,就用默认的MYISAM)rn     3.打开MySQL数据库rn
springBoot+JPA+Mysql项目中的事物管理,发生异常未回滚的问题
    今天在项目中调试代码的时候,方法中报错,当去数据库中查看该方法操作的那条数据记录时,发现数据已经被修改了。但是该方法整体是处在@Transactional事物管理之下的,也就是说,发生异常时,事物没有回滚。    经过查找原因,发现是Mysql表类型问题。Mysql表类型分为InnoDB和MyISAM,二者有本质上的区别。具体区别请链接到http://www.cnblogs.com/xio...
spring在service层的方法报错事务不会回滚
n@Transactional(rollbackFor = {Exception.class})npublic void insertData() throws Exception {n // 业务代码1n business1();n n // 业务代码2n business2();n n // 业务代码3n business3();n}nnpublic void business1() {n /...
在springboot中关于@Transactional事务注解不能回滚的原因
n @Overriden @Transactional(readOnly = false,rollbackFor=Exception.class,propagation=Propagation.REQUIRED)n public ResultBean&amp;lt;String&amp;gt; test(GoodsInfo goodsInfo) {n try {n GoodsInfo goodsInfo1 ...
SpringMVC+Spring JdbcTemplate框架事务无法正常回滚
n rnapplicationContext.xml将Controller的注解打消掉rn &amp;lt;context:component-scan base-package=&quot;com.steven&quot;&amp;gt;rn &amp;lt;context:exclude-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Contr...
sql异常,Spring Aop事务不回滚解决方案
在做Spring声明式事务的时候,数据库连接池是HikariCP, 如果sql报错,比如某一个字段can’t be null, 这种sql exception就无法回滚,但是如果是1/0报错,事务就可以回滚,在网上查了很多资料,试了下面几个方法: n1. 检查mysql是否是innodb? n2. 自定义异常; n3. throw new RuntimeException(); n4. 在try ...
spring 事务应用误区总结:那些导致事务不回滚的坑
基于JDBC的 Spring事务在项目中常用来保证数据的一致性, 想要正确的使用,绝不是加一个@Transactional那么简单。最近团队内在排查事务不生效的问题时,就遇到了一个很典型的错误应用的场景。本文就几个容易遇到的导致事务不生效的场景做个总结。一、Spring事务原理在使用JDBC事务操作数据库时,流程如下:1//获取连接 n21.Connection con = DriverManag...
Spring添加了注解@Transactional事务不回滚总结
Spring加@Transactional事务不回滚n二、总结n1.首先你要确保你的配置文件正确,当然这个可能性很低,因为架构师都帮你弄好了(针对和当时的我一样的小白而言)n2.如果你的配置文件都正确,那么很有可能你执行数据库更新、插入的时候加了 try  catch 了,所以不
spring管理事务异常时事务未回滚问题笔记
本片博客旨在记录项目开发过程中遇到的一些问题,提高日后在解决问题上的能力n问题情形:在维护一个2012年的老项目时候出现了一个事务不一致的问题,如果不是仔细点,还真不能发现这个问题,代码如下:npublic boolean checkTaskIsPass(Integer pId,Integer type) {n try{n this.taskAdminDAO.checkTaskI
Spring mvc+mybatis+mysql事物回滚不生效问题
    开始我打算在controller里面控制回滚,但尝试很多次无效,于是还是老实的在service里面控制事物回滚。    mysql需要表类型类为innoDB才行。有人说用mysql的话要关闭自动提交autocommit才行,我亲测不关也没问题。    不上不管开不开都可以正常回滚。    关于配置,注意点是spring-mvc中扫描注入时不要扫描service。原因是spring mvc扫...
解决Spring的声明式事务中的自定义异常不回滚问题
@Transactionaln public void opreateAccount(int fromUserId, int toUserId, BigDecimal money) {n System.out.println("转账开始!!");n try{n //根据id获取转出用户金额n BigDecimal fromaccount = userdao.getAccount(fro
spring事务异常回滚,不抛出事务失效
之前对于spring事务的理解一直错误的以为”在try捕获异常时开启事务,在catch块中回滚事务”:public void saveUser(User user){n try{n 事务开启n userDao.save(user)n }catch(Exception e){n 事务回滚n }n}或许是之前控制事务都是出于业务层,并且在捕获异常之后都有向
spring事务失效解决方法并进行事务的部分回滚
内容:rn1.spring事务失效场景。rn2.解决方案.rn3.Spring事务回滚到指定片段。rn场景描述:rn当我们从12306点击最后一步付款操作,后台有两步操作。1.将乘客用户信息插入到订单表。2.向用户手机发送短信提示。rn因为发送短信的方法需要掉外部网关,在这一步通常会发生发送失败。我希望当发送短信这个方法不影响我整体业务,即即使不发送短信车票订单同样向数据库中插入。rn问题1:sp
Spring事务异常回滚,捕获异常不抛出就不会回滚
下面这种情况,使用了catch捕获了异常,spring事务不会发生回滚rntry {rnuserDao.save(user);rnuserCapabilityQuotaDao.save(capabilityQuota);rn} catch (Exception e) {rnlogger.info("能力开通接口,开户异常,异常信息:"+e);rn}rnrnrn 默认spring事务只在发生未被捕获
spring注解事务及事务回滚失败的原因
背景spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行
springmvc+hibernate整合事务不回滚,谁来拯救我
最近心血来潮研究下了springmvc,发现比struts2好用多了,配置也方便,捣鼓了一阵,最后想把hibernate也整进去,结果悲剧就来了,事务就是不回滚,实在没招了,哪位大侠给看下,上代码rnrnspringmvc-servlet.xmlrn[code=&quot;java&quot;]rnrnrnrn rn rnrn rn rn rn rn rn rn rnrnrn rn rn rn rn ...
Spring事务异常回滚,try catch 捕获异常不回滚
 nn nn nn今天敲项目的时候一个方法有两个事务,用了try catch之后一直出现一个报错一个不报错,不报错的却不回滚的现象,仔细检查解决问题nn nn例:一个方法报异常,另一个方法不会回滚nnntry { n userDao.save(user); n userCapabilityQuotaDao.save(capabilityQuot...
记使用Junit单元测试事务无法回滚的问题(spring事务和断路器-Hystrix冲突)
在使用Junit的时间发现事务无法回滚,后来把Hystrix断路由删掉发现可以的,源码调式发现Hystrix和sqlsessionFactory使用的不是同一个contection,最后是将断路由的策略改成信号量(SEMAPHORE)解决的,目前没找到断路由线程池(THREAD)策略和Junit事务共存的办法。综合上述,配置改为如下即可解决:hystrix.command.default.exec...
spring+ mybatis 事务不能回滚问题解决
【2018年4月13号更新修改该说明】,之前我说自动扫描要精确到Controller就可以解决回滚问题,确实可以解决问题,自动装配的范围变小了,这样其他的Service层、dao层就不能自动装配了,这样肯定不合理。   原来Spring已经有相关的配置处理这个问题了,如果你项目不能回滚,肯定是把Controller层扫进去了,在application.xml文件中自动扫描配置新增&amp;lt;conte...
Spring jdbcTemplate之决不回滚解决方案
最近在学习spring,用到这个jdbcTemplate时发现他怎么都不回滚,就算用spring最开始的侵入式回滚都不好使,我蒙蔽了,一会弄明白了一定要写出来和大家分享,这个人性的jdbcTemplate
Spring 事务异常回滚
 rn先看如下代码rn rn rn@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { AppBizExeA.class } , noRollbackFor = { AppBizExeB.class })rn public void method1() throws Exception {rn System.out....
Spring @Transaction配置示例及发生不回滚原因深度剖析
背景nn最近在公司做的一个项目,用的是SpringMVC框架,数据库用的是MySql,刚开始并没有加入事务,其实主要原因是本人没有使用过SpringMVC的事务。nn问题的产生和解决nn使用事务,直接问百度,我选择的是注解的方式。n在配置文件中配置事务管理器和驱动:nn n <beann id="transactionManager"
Springboot中声明事务@Transactional,为何有时候声明了事务报异常数据却不会回滚
@Transactionalnn这个注解相信大家都不陌生,这是事务的注解,什么是事务,无非就是未保证数据一致性,当出现任何异常时候出现数据回滚nn注解是是不需要写提交事务的。nn那么,最近我发现,这个@Transactional的注解,并不是所有异常都可以进行数据回滚,他只有是RuntimeException类及其子类(中文称为:运行时异常/unchecked异常/未检异常)异常的时候才会进行数据...
spring boot 显示处理事务回滚
显示处理事务回滚的原因是,我们希望直接在控制层就把异常处理了。同时向前台反馈错误,但是如果在控制层的函数上添加@Transactional注解,必须将异常抛出,如果必须抛异常nnnnn//获取当前登录用户,指定的MT4账户的历史订单,分页获取n@ResponseBodyn@RequestMapping(value = &quot;/deleteMt4&quot;, method = {RequestM...
Spring MVC @Transactional注解方式事务无法回滚原因及解决方案
近期在做一个接口,采用的是Spring MVC的框架写的,但是当配置好框架,写完方法之后,发现在service层加了@Transactional注解的方式,竟然无效,无法进行事务的回滚,发现一般问题都不存在,一般@Transactional注解了,事务无法回滚是因为三个原因:nn1.方法可能不是public的声明nn2.异常类型是不是unchecked异常nn这个说明一下,在@Transactio...
Springboot 事务回滚不生效问题
检查以下几点:nn1.数据库是否为InnoDB引擎nn2.配置文件中是否开启nnntransaction:n rollback-on-commit-failure: truenn3.是否在启动类中加入注解nnn@EnableTransactionManagementnn4.测试问题:nn@Transactional注解必须和抛出异常的位置在一起nn在Service中加入的事务注解,手动抛出异常时...
spring事务管理,基于xml配置完成事务回滚;spring中数据库表中字段名和pojo中属性名不一致时候,实现RowMapper接口手动封装
声明使用JDK8,spring5.0.7,n测试说明:nservice 层 声明接口进行转账,从A转账B ,然后对AB 进行更新操作,在事务中对find方法开启 只读权限,无法进行更新操作,造成事务回滚进行测试事务;n主要测试方法: void tranfer(Long fromId , Long toId ,Double money);nn数据库如下:nn子工程结构;nnnpoj...
spring 事务是否会回滚的几种写法
spring 事务注解nn默认遇到throw new RuntimeException("...");会回滚n需要捕获的throw new Exception("...");不会回滚nn// 指定回滚n@Transactional(rollbackFor=Exception.class) n public void methodName() {n // 不会回滚n t
关于Spring的@Transactional注解失效以及事务无法回滚问题
关于Spring的@Transactional注解失效以及事务无法回滚问题@Transactional失效问题最近写的项目中需要一个service中的部分事务执行完就被commit,但是部分service需要失败回滚。因此写在一个大的service中并且加上@Transactional显然是无法满足需求的。n因此这是需要把原先的一个service服务拆分,如原先的serviceA被拆分成servic
Spring声明式事务手动回滚方案
Spring的事务一般分为声明式事务(或叫注解式事务)和编程式事务,编程式事务比较灵活,可以将事务的粒度控制的更细,并且可以控制何时提交,哪种情况回滚。而声明式事务使用@Transactional注解,使用起来没有那么灵活,但是对业务代码没有入侵,而且本身支持一些异常情况下的回滚。但是这个异常是不可以捕获的,如果代码里捕获了,那么事务中已经执行了的部分会提交。代码如下:rnrn@Transacti
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java 事务 学习 数据库没有选修课程