精华内容
下载资源
问答
  • Transaction rolled back

    千次阅读 2018-01-05 17:26:15
    出现这个问题的原因是查询跟插入一个事务了,因此在插入事务或者查询事务回滚的时候冲突了。把这两个分开来,查询归查询,插入归插入。

    出现这个问题的原因是查询跟插入一个事务了,因此在插入事务或者查询事务回滚的时候冲突了。把这两个分开来,查询归查询,插入归插入。

    展开全文
  • org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 解决方法是调用Test2实例的test2方法的时候,新建一个单独事务...

    1、前言

      考虑到功能的划分,将一个功能模块的不同职责划分为到几个service中,同时为service添加数据库事务(即添加@Service、@Transactional注解,添加@Transactional注解到类上,则类中的方法都会添加事务),由于需要中途报错不能直接返回,需要完全执行完再把结果返回,故添加try-catch语法糖,try-catch里面调用其他service 方法,解决过程涉及到spring 事务的传递性,下面再做讲解。

    2、报错重现

    Test2代码:

    @Service
    @Transactional
    public class Test2 {
        public void test2(){
            throw new RuntimeException("test2 throw");
        }
    }
    

    Test1代码:

    @Service
    @Transactional
    public class Test1 {
        @Autowired
        private Test2 test2;
        public void test1(){
            try {
                test2.test2();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    junit调用代码:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TestTransaction {
        @Autowired
        private Test1 test1;
        @Test
        public void transaction() {
            test1.test1();
        }
    }
    

    这里重点是Test1实例方法try-catch了test2的报错。

    3、spring事务的传播性及分析

    事务传播行为类型:

    事务传播行为类型说明
    PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    表格引用自:Spring事务传播机制

    在这里插入图片描述
      从注解的默认值可以看到,PROPAGATION_REQUIRED是默认值,那么就要想一下,如果报错重现一样出现事务嵌套,使用默认值会出现怎样的情况。
      PROPAGATION_REQUIRED传播性描述是这样的:

    如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择

    所以我们描述一下过程:
    1、test1方法开启事务
    2、调用Test2类实例的test2方法,由于事务传播特性都是默认值,所以test2方法根据PROPAGATION_REQUIRED的特性,会将本身事务加入到test1的事务中,就是用沿用test1的事务。
    3、test2加入test1方法的事务
    4、test2抛出异常
    5、test1进行try-catch
    此时test2抛出异常,会导致整个事务回滚,即test1和test2和合并事务回滚,test1本身的不想报错就回滚的操作的,是想让所有方法执行完。但属于同一个事务,所以导致报错:

    org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
    

    解决方法是调用Test2实例的test2方法的时候,新建一个单独事务。
    1、符合要求的是PROPAGATION_REQUIRES_NEW(新建事务,如果当前存在事务,把当前事务挂起。
    2、试了一下PROPAGATION_NESTED(如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。)这个特性,好像报了另一个错误。

    解决方法是给子事务更改事务传播特性,Test2改为:

    @Service
    @Transactional
    public class Test2 {
        @Transactional(propagation = Propagation.REQUIRES_NEW)//这是新增
        public void test2(){
            throw new RuntimeException("test2 throw");
        }
    }
    
    展开全文
  • Transaction rolled back because it has been marked as rollback-only 中文翻译就是: 事务已回滚,因为它被标记成了只回滚 代码片段: // 我的代码 @Transactional(readOnly = true, rollbackFor = ...

    问题描述:

    同事测试时使用异常数据,代码报错但是并不是异常产生的错误,而出现:

    Transaction rolled back because it has been marked as rollback-only

    中文翻译就是:

    事务已回滚,因为它被标记成了只回滚

    代码片段:

        // 我的代码
        @Transactional(readOnly = true, rollbackFor = Exception.class)
        public String select(String pid,String id) {
            List<Object> list = this.commonService.select(pid,id);
            if (CollectionUtils.isEmpty(list)) {
                throw new ApplicationException("查询数据异常");
            }
            ... 
        }
        
        .....
        // 调用代码
        @Transactional(readOnly = true, rollbackFor = Exception.class)
        public String select(String pid,String id) {
            try{
                // 针对异常进行捕获,但是没有抛出异常
                this.measureService.select(pid,id);
             }catch(ApplicationException e) {
                
             }
        }

    错误原因分析:

    A和B都有事务,A调用B,B中抛出了异常,A这边捕获B的异常,但是没有将异常抛出,导致A方法执行结束时,提交事务,出现了上述的错误

    @Transactional原理:

    @Transactional其内部是基于Aop实现的,

    SpringAop异常捕获的原理:本拦截的方法需显示抛出异常,并不能经过任何处理,这样Aop代理才能捕获方法的异常,才能进行回滚,默认情况下Aop只捕获RuntimeException异常

    这样原理就简单了,我们知道事务是可以继承的,那么A和B中可以理解为同一个事务,我们在B中进行了抛出了异常,然后再A中进行了捕获,但是没有抛出该异常,相当于在A中进行了处理,没有抛出该异常。细分下:B方法返回时,transcation已经被设置为rollback-only了,但是A这边捕获异常,没有继续向外抛,那么A方法结束时,就会由Aop来提交事务,但是此时transcation已经被设置为rollback-only了,所以就会抛出上述异常。

    Rollback-only异常的解决:

    1.B方法中我们可以手动捕获异常,并且处理该异常

            try {
                int i = 1/0;
            }catch (Exception e) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }

    2.B方法中的事务我们可以开启一个新的事务,与A中的事务不一样,这样A中出现异常回滚的事务与B中的事务不是同一个事务,这样话就可以避免上述的问题了,但是这样会出现一个问题,如果B中也有对数据的操作,那么B中出现异常,是不会让A中的事务回滚的。该方法适用于B中没有对数据的操作

    // 在B中方法上添加注解,另开一个事务
    @Transactional(propagation = Propagation.REQUIRES_NEW)

     

    展开全文
  • Transaction rolled back because it has been marked as rollback-only异常原因及处理 报错异常信息: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has ...

    Transaction rolled back because it has been marked as rollback-only异常原因及处理

    报错异常信息:

    org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:873)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:710)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:152)
        at com.everhomes.db.DefaultDbProvider.execute(DefaultDbProvider.java:313)
        at com.everhomes.contract.DefaultContractServiceImpl.entryContract(DefaultContractServiceImpl.java:1167)
        at com.everhomes.contract.contractFlow.ContractFlowModuleListener.onFlowCaseEnd(ContractFlowModuleListener.java:306)
        at com.everhomes.flow.FlowListenerManagerImpl.onFlowCaseEnd(FlowListenerManagerImpl.java:145)
        at com.everhomes.flow.FlowStateProcessorImpl.endStepEnter(FlowStateProcessorImpl.java:975)
        at com.everhomes.flow.node.FlowGraphNodeEnd.stepEnter(FlowGraphNodeEnd.java:22)
        at com.everhomes.flow.FlowStateProcessorImpl.step(FlowStateProcessorImpl.java:781)
        at com.everhomes.flow.FlowServiceImpl.fireButton(FlowServiceImpl.java:2625)
        at com.everhomes.flow.FlowController.fireButton(FlowController.java:212)
        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:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at com.everhomes.controller.XssFilter.doFilter(XssFilter.java:51)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at com.everhomes.controller.ResponseLoggingFilter.doFilter(ResponseLoggingFilter.java:29)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:155)
        at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:123)
        at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

     

    1、异常原因:在事务里面还有一个事务,里面的事务报错,报错信息未被抛出,外层的事务捕捉不到异常,导致里面的事务要回滚,而外层的事务要提交,所以报错。

    2、解决:1、里面的事务抛出异常信息,外层捕捉到异常进行处理。2、保证外层事务调用接口参数的正确性。

    展开全文
  • 我是 try catch 又加了throws 去掉 throws 好了
  • 之前经常报"Transaction rolled back because it has been marked as rollback-only"这个异常 字面意思是"事务回滚了,因为它被标记了必须回滚",最开始完全不懂事务的嵌套,每次出现这个错误都想知道为什么,但是...
  • 最近遇到这样的问题,使用spring时,在业务层需要捕获异常(特殊需要),当前一般情况下不需要这样做的。具体如下: 在ServiceA类中有method1,在该...spring提示:org.springframework.transaction.UnexpectedRoll...
  • 从 rollback-only异常中分析下事务中propagation的应用和理解 rellback-only异常场景描述 项目已经过去很久了,今天突然间出现一个BUG,我... Transaction rolled back because it has been marked as rollback-onl...
  • 通过排查日志发现,具体的错误信息是Transaction rolled back because it has been marked as rollback-only,很明显是一个和事务相关的错误。且通过对业务逻辑中日志答应状况的排查,发现,业务正确执行到了最后,...
  • 但笔者今天不讨论这个,哈哈~本文将从应用层面稍带一点源码,来解释一下我们平时使用事务遇到的一个问题但让很多人又很棘手的问题:Transaction rolled back because it has been marked as rollback-only,中文翻译...
  • org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only at org.springframework.transaction.support....
  • 出现这个错误的原因是事务双重回滚了。 模块间的相互调用时,被调用的模块有事务提交,在报错之后事务回滚,返回错误信息, 调用模块收到被调用模块的错误信息再一次进行事务回滚。 解决方法:在调用模块方法上挂起...
  • 最近上线了一个新功能,在某个特定场景下保存数据时,一直提示Transaction rolled back because it has been marked as rollback-only异常。 结论 先说结论,**是因为@Transactional 注解使用的有问题。**我们这个...
  • 造成这个异常的原因是在... org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackE
  • } } 在这种情况“同样Propagation.REQUIRED事务传播行为下,外部业务方法调用内部业务方法且对内部业务方法进行了try...catch”的时候会爆出这个错误 Transaction rolled back because it has been marked as ...
  • org.springframework.transaction.UnexpectedRollbackException: JTA transaction already rolled back (probably due to a timeout) 错误原因默认的Spring 默认的事务是 tomeout 是 -1 原因是 这里使用Spring 默认...
  • 解决参考:... 异常信息 ERROR c.r.f.w.e.DefaultExceptionHandler - [notFount,50] - 运行时异常: org.springframework.transaction.UnexpectedRollbackExceptio...
  • 使用Spring事务时,出现异常:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 这个错误正确的理解应为:在提交事务时,发现...
  • org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 问题分析: 1、嵌套的两个方法都加了@Transaction注解,事务嵌套导致了...
  • 父方法再执行事务就会报Transaction rolled back because it has been marked as rollback-only异常。 代码: // 父方法 @Transactional(rollbackFor = Exception.class) public void test() {
  • 背景 这里出现的问题是在service层上调用了其它service类,导致事务问题。 spring-aop的问题,他的相当于2个事务了,事务传播问题。 解决方案 用dao类,或者用compont类。...UnexpectedRollbackException解决方案 ...
  • Transaction rolled back because it has been marked as rollback-only分析解决方法
  • Transaction rolled back because it has been marked as rollback-only 1. 原因 线上故障,后来定位异常,最终发现是spring事务嵌套的导致的,特此记录 之前同事写的上传文件模块,因为涉及到上传到neo4j图形...
  • org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 啥,什么操作,代码也没动呀,????那么,开始认真的分析,首先,然后 ...
  • 在程序运行过程中出现:org.springframework.transaction.UnexpectedRollbackException:Transaction rolled back because it has been marked rollback-only 抛出该异常的原因,方法A调用了方法B, 方法A有事务,...
  •  org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only   字面意思:  出现了不可预知的回滚异常,因为事务已经被标志位...
  • 翻译: 事务已被回滚,因为它已被标记为仅回滚实例: ...方法A执行成功后执行B时报异常,此时如果try catch方法B则报异常:Transaction rolled back because it has been marked as rollback-only。
  • session.commit() except: # if any kind of exception occurs, rollback transaction session.rollback() raise finally: session.close() 另一种形式: try: ...... ...... ...... ...... except Exception: ...
  • 既然是字段长度不够为什么是报:Transaction rolled back because it has been marked as rollback-only这个错呢? 这个问题我也取看了下,主要是因为:多层嵌套事务中,如果使用了默认的事务传播方式,当内层事务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,769
精华内容 2,707
关键字:

backrolledtransaction