当前位置: 首页 > 知识库问答 >
问题:

为什么spring事务回滚不删除插入数据库的数据?

彭英逸
2023-03-14

在服务中定义了一个事务性函数,并从一个调度任务调用它,在这个函数中,对同一对象进行了两轮插入,在第二轮插入过程中,由于重复键的存在,会引发异常。我已经将事务注释配置为针对抛出的异常进行回滚,并且打开了log4j springframework日志,从日志中我可以看到事务管理器正在对回滚进行一些操作,例如确定是否对抛出的异常进行回滚,但是我看不到任何正在进行数据库删除操作的日志,并且检查数据库显示回滚没有删除第一轮插入中插入的记录。

我搜索了很多关于不回滚的问题,主要是因为没有定义回滚的异常,但在我的例子中,我定义了它。另一个常见的原因是对事务性方法进行内部调用,但在我的例子中,首先我使用的是aspectj配置,其次我从另一个类(调度器)调用事务性方法。

所以请大家对我的案子提供一些帮助为什么它不起作用?????

下面是我的代码、配置和日志。我正在使用Spring3.x、mybatis和MySQL。=======应用程序上下文配置========

    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="mysqldataSource" /> 
<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" />

========交易方法=================

    @Transactional (rollbackFor = {Exception.class,MySQLIntegrityConstraintViolationException.class,DuplicateKeyException.class}, propagation = Propagation.REQUIRED)
public void testTransaction()

========来自spring Framework的html" target="_blank">日志==========

2014-12-18 13:40:04.747[org.SpringFramework.Transaction.Support.TransactionSynchronizationManager][taskScheduler-1](TransactionSynchronizationManager.java:140)-绑定到线程[taskScheduler-1]的键[org.apache.commons.dbc.basicDatasource@52ffe2CB]的调试检索值[org.SpringFramework.jdbc.DataSource.ConnectionHolder@6921ddb6]2014-12-18 13:40:04.963rCodesFactory][taskScheduler-1](SqlErrorCodesFactor.java:175)-找到“MySQL”的调试SQL错误代码2014-12-18 13:40:04.978[org.springframework.jdbc.support.SqlErrorCodesQlexceptionTranslator][taskScheduler-1](SqlErrorCodesQlexceptionTranslator.java:403)-调试转换SQL状态为“23000”的SQLException,错误代码为“1062”,消息[项“primary”的条目“

]2014-12-18 13:43:10.776[org.SpringFramework.transaction.Interceptor.RulebasedTransactionAttribute][taskScheduler-1](RulebasedTransactionAttribute.Java:148)-调试获胜的回滚规则是:RollbackRuleAttribute具有模式[org.SpringFramework.DAO.DuplicateKeyException]2014-12-18 13:43:10.785[org.SpringFramework.JDBC.Datasource.DatasourceTransactionManager]正在完成异常后[org.sample.service.impl.TestTransactionimpl.TestTransaction]的事务:org.SpringFramework.dao.DuplicateKeyException:

;SQL[];密钥“主”的条目“20141218013806914313591877775”重复;嵌套异常为com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:项“primary”2014-12-18 13:43:52.875[org.springframework.transaction.interceptor.rulebasedtransactionattribute][taskScheduler-1](Rulebasedtransactionattribute.java:131)的重复项“20141218013806914313591877775”-调试应用规则确定事务是否应在

共有1个答案

池恩
2023-03-14

好吧,我想我找到了一个方法来修复它,虽然我不知道真正的根本原因。我还是想把它贴出来,以防其他人也有类似的问题。这个链接中的讨论给了我一些提示:http://www.coderanch.com/t/590731/spring/spring-transaction-rollback在这个讨论中,asker在日志中发现了两个“返回到数据源的JDBC连接”操作,所以我检查了我的日志,在启动回滚之前和之后也发现了两行“返回到数据源的JDBC连接”。

2014-12-18 14:59:43.321[org.SpringFramework.JDBC.DataSource.datasourceutils][taskScheduler-1](Datasourceutils.Java:327)-debug返回到DataSource的JDBC连接2014-12-18 14:59:43.321[org.SpringFramework.JDBC.datasourceTransactionManager][taskScheduler-1](AbstractPlatformTransactionManager.Java:844)-debug启动事务回滚2014-12-18 14:59:43.321[taskScheduler-1](TransactionSynchronizationManager.Java:331)-调试清除事务同步2014-12-18 14:59:43.321[org.SpringFramework.transaction.Support.TransactionSynchronizationManager][taskScheduler-1](TransactionSynchronizationManager.Java:243)-调试从线程[taskScheduler-1]2014-12-18 14:59:43.352[org.SpringFramework.JDBC.DataSource.DataSource.DataSource]删除了键

所以我检查了我的项目,发现了两个applicationcontext*.xml,它们都配置了事务管理器,我从另一个applicationcontext4test.xml中删除了重复的配置,然后再次运行,现在回滚工作了!!!!而当事务工作时,我可以从调试中看到,事务管理器只是保留对数据库的提交,直到方法无一例外地完成,这就向我解释了事务在Spring中是如何工作的.....这是我无法理解的“事务管理器如何知道如何删除我插入数据库的记录时,异常发生”愚蠢的问题哈!

 类似资料:
  • 我试图在一个事务中插入两个记录到我的数据库中。第二次插入失败,但是在回滚中第一次插入没有被删除: (我还尝试将save方法替换为:jpaContext.getEntityManagerByManagedType(WebMessage.class)。坚持(wm);因此,我不使用crud保存,但问题仍然存在) 我启用了事务日志以查看发生了什么,我发现: 在调用test()之前,会创建一个新事务,因为@

  • 我试图编写一个spring-cloud-stream函数(spring-starter-parent 2.5.3,java 11,spring-cloud-version 2020.0.3),该函数同时具有Kafka和Postgres事务。每当使用的消息以字符串“fail”开始时,该函数将引发一个模拟错误,我希望这将导致数据库事务回滚,然后导致kafka事务回滚。(我知道Kafka交易不是XA,这

  • 我们为JPA配置了Spring数据。服务事务方法不会因错误而回滚(例如,DB ConstraintViolationException)。 我能找到的最接近的是这个(事务不回滚)Spring-data、JTA、JPA、Wildfly10但是我们没有任何XML配置,我们所有的配置都是基于Java的。 本质上,服务方法如下所示:不捕获错误,抛出所有内容。

  • 我在计算一个简单蒸汽的最大值,结果是: (S11000,S1,值:999) (S12000,S1,值:41) 最后一行数据明显迟到了: 为什么按第一个窗口(0-1000)计算? 我认为第一个窗口应该在到达时触发。 对于这个结果,我很疑惑。 MyReductingMax(),MyWindowFunction()

  • 问题内容: 我正在帮助我的一位朋友。他正在使用JSF 2.0和mysql创建Web应用程序。 在创建数据库时,他使用了以下查询。 截止日期网站运行良好。今天,客户尝试输入阿拉伯文字,他们说输出结果很奇怪。我朋友做的是在将数据输入到DB之后,他还在另一页上打印了相同的数据。但是他认为输出为。我不明白为什么正确设置数据库字符后他会得到这样的信息。 web.xml的 内容如下。 在每个 .xhtml 页

  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb