`

Transaction marked as rollback only异常

 
阅读更多
今天在进行数据库操作时出现:Transaction rolled back because it has been marked as rollback only异常,刚开始没仔细看一直以为是spring的配置文件,因为我的spring配置事务片段如下:

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="get*" read-only="true" />
    <tx:method name="*" />
    </tx:attributes>
    </tx:advice>

      我这里将service的所有get方法定义为只读事务,起初以为是这里的配置文件,所就将get的只读去掉,可仍然出现类似的错误。可见问题不是这个事务配置的问题,经过google一番后,应该是事务被提交了两次导致的错误。再仔细查看代码发现是在service中嵌套调用了另外一个service的更新操作,从而导致了事务被两次提交。代码类似如下:

    ...
    public void update() {
    MyObj obj1 = aservice.get(1);
    aservice.update(obj1);
    Query query = em.createQuery("UPDATE ....");
    query.executeUpdate();
    }
    ...

      update方法是一个service的方法,在该方法中调用了另外一个aservice的update方法,由于get方法是只读事务,所以第一条语句不会报错,当aservice执行完update后,其实事务已经被提交了,同时spring将该事务标志为rollback only,等到最后执行executeUpdate方法时,由于事务已经提交,所以就会被抛出前面提到的异常。可见,spring在处理事务时,多个service嵌套调用时使用的都是同一个事务,而不是每个不同的方法都使用新事务。
 

 如果要采用spring的线程池进行后台的业务处理的话,尽量把业务方法重构到一个service里面进行调用,否则也会报告上面的错误。

更加详细的资料请参阅 http://openmrs-mailing-list-archives.1560443.n2.nabble.com/transaction-rollback-error-td1659793.html

 

分享到:
评论

相关推荐

    Could not roll back Hibernate transaction.doc

    nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的主要原因是手动对数据库做了些操作,导致...

    Transaction Rollback 事务 让你的对象支持事务

    难道只要数据库连接才支持事务?... 自行实现所有细节,比如说银行的提款机模拟,在Withdraw的代码中检查支取金额后的余额或者检查支取金额的大小是否超过当天限额限制,否则报错或退出当前Withdraw方法 ...

    HibernateSession , Transaction 研究

    `Session`提供了一系列的事务管理方法,如`beginTransaction()`、`commit()`和`rollback()`。 1. `beginTransaction()`:启动一个新的事务,这通常是所有数据库操作的起点。 2. `commit()`:提交当前事务,意味着...

    Spring 常用 Transaction Annotation

    例如,当一个方法抛出未检查异常(继承自RuntimeException的异常)时,Spring会自动回滚事务,而检查异常(非RuntimeException)则不会导致回滚,除非明确指定`rollbackFor`属性。 最后,结合`Book1.xlsx`这个...

    ERRORLOG

    org.hibernate.TransactionException: JDBC rollback failed

    javax.transaction-api-1.2-API文档-中文版.zip

    赠送jar包:javax.transaction-api-1.2.jar; 赠送原API文档:javax.transaction-api-1.2-javadoc.jar; 赠送源代码:javax.transaction-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.transaction-api-1.2....

    Transaction

    事务的主要目标是保证数据的一致性,即使在系统故障或其他异常情况下也能做到这一点。 事务有四个著名的ACID属性: 1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不存在部分完成的情况...

    javax.transaction.jar

    【javax.transaction.jar】是Java平台上的一个核心组件,主要用于处理分布式环境中的事务管理。这个库包含了一组接口和类,这些接口和类定义了事务管理的API,使得开发者能够在Java应用程序中实现事务处理的规范。在...

    javax.transaction-api-1.2-API文档-中英对照版.zip

    赠送jar包:javax.transaction-api-1.2.jar; 赠送原API文档:javax.transaction-api-1.2-javadoc.jar; 赠送源代码:javax.transaction-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.transaction-api-1.2....

    SQL Server数据库P166 (3)ROLLBACK TRANSACTION将显式事务或隐式事务回滚到事务的结束.sql

    内容概述:SQL Server数据库相关内容,对应张磊著《SQL Server数据库应用技术项目化教程》中166页(3)ROLLBACK TRANSACTION将显式事务或隐式事务回滚到事务的结束所对应的源码。代码经个人运行后无误,如果下载后运行...

    C#中调用Transaction

    本文将深入探讨“C#中调用Transaction”的相关知识点,包括事务的基本概念、事务的特性、如何在C#代码中创建和管理事务,以及与数据库交互时事务的应用。 ### 1. 事务基本概念 事务是数据库操作的一组逻辑单元,它...

    CALL TRANSACTION USING... 参数祥解

    CALL TRANSACTION USING 参数详解 CALL TRANSACTION USING 语句是 ABAP 中提供的一个方便的执行批量输入的语句,使用它可以通过程序代码完成多个事务码的连续执行。BDC_TAB 是批输入任务表,网上有很多例子了,大家...

    Springboot 集成Tcc-transaction1

    字段包括事务ID(TRANSACTION_ID)、业务领域(DOMAIN)、全局事务ID(GLOBAL_TX_ID)、分支事务ID(BRANCH_QUALIFIER)、事务内容(CONTENT)、状态(STATUS)、事务类型(TRANSACTION_TYPE)、重试次数(RETRIED_...

    TCC-Transaction分布式事务DEMO

    在这个名为"TCC-Transaction分布式事务DEMO"的项目中,我们将深入探讨TCC模式以及如何在基于Mysql数据库的环境中实现它。 **TCC模式详解** TCC(Try-Confirm-Cancel)是一种补偿型的分布式事务处理模式,主要由三...

    transaction

    在Java编程语言中,"transaction"一词通常与数据库操作紧密相关,特别是在处理并发和数据一致性时。事务(Transaction)是数据库系统中的一个核心概念,它确保了数据操作的原子性、一致性、隔离性和持久性(ACID特性...

    Principles of transaction processing

    根据提供的文件信息,可以提炼出以下与“Principles of transaction processing”相关的知识点: 1. 事务处理的原理 事务处理系统是计算机系统的一个重要组成部分,它涉及到如何高效、安全地处理各种事务。事务处理...

Global site tag (gtag.js) - Google Analytics