我有一些Java代码使用JDBC连接到MySQL数据库,然后代码执行一些读操作,然后进行一次更新,所有使用相同的连接。如果出现异常,则调用connection.rollback()
;如果没有异常,则调用connection.commit()
。在这个阶段,连接是每次运行测试时新创建的(即,它不是来自池)。我的代码只创建一个连接,并在整个测试中使用它。
正在使用的连接在创建连接实例后立即调用connection.setAutoCommit(false)
。
出于某种原因,当出现异常并调用connection.rollback()
时,发现我的更新已经提交,而不是回滚。
通过调试,我确认了以下几点,
>
在调用connection.setautoCommit(false)
之后,connection.getautoCommit()
将返回一个false
值,这与预期的一样。此外,“select@@session.autocommit”
返回一个0
值,这表明自动提交已关闭。
就在调用connection.rollback()
之前,同样的检查显示自动提交已关闭,正如预期的那样。
connection.commit()
肯定没有被调用,而connection.rollback()
肯定被调用。
我还尝试显式运行“rollback;”
语句,但这并不能解决我的问题。我还尝试在创建连接后显式运行语句“set AUTOCOMMIT=0;”
。
我的所有表都使用InnoDB的存储引擎。通过SQL工作台,关闭自动提交,回滚和提交工作按预期进行。
我使用的是MySQL版本'5.0.91-community-nt'。MySQL jdbc驱动程序版本是5.1.19。我用的是Java5。
有没有人对为什么我的更新在关闭自动提交、从不调用提交和显式调用回滚的情况下仍被提交有什么建议?
干杯。
我在OP中引用的代码不是在单个块中,而是分散在各个类中。为了满足上面关于代码示例的查询,我准备了一个代码块来解决这个问题。代码块完成后,我对其进行测试,以确保可以复制该问题。嗯,我不能复制这个问题-回滚工作得很好。这使得我要通过生产代码来计算出它正在做的所有事情,而不是我放在一起的代码块。
结果表明,生产代码既创建又删除临时表。最相关的是,它在执行更新后删除临时表,无论是否存在异常,它都删除临时表。事实证明,删除MySQL中的表会发出隐式提交调用。因此,在我的代码抛出异常和我的代码调用connection.rollback()之间,它删除表,从而导致隐式调用提交。因此我的“自动提交”问题。
case-0-3.sql: 我在进行任何更改之前标记数据库: 之后,我在每个文件应用后应用文件和标记数据库: 求求你,救命。可能有人在sql或其他格式中使用回滚操作?哪里错了?我做错了什么?它是工作液基功能吗?
case-0-3.sql: I在进行任何更改之前标记数据库: 之后,我应用文件,并在每个文件应用后标记数据库:
问题内容: 我叫两种方法,第一种方法更新一个表,第二种方法在另一个表中插入一条记录。当第二笔交易失败时,它不会回退第一笔交易。 这是我的支持豆: EJB接口: EJB类: 我的自定义例外: 编辑: 添加了DAO类: 和DAO接口: 问题答案: 在这种情况下,关键问题是某些JBoss版本中数据源中的默认错误。原始代码很好,并且可以在其他应用程序服务器(WebSphere App Server和轻量级
在spring boot中,我试图创建我的第一个事务性测试,但trasaction不起作用。 null 我需要的是: 将数据插入事务。 从事务中读取数据。 测试返回的数据。 回滚事务。
问题内容: 我正在使用MySQL的AUTO_INCREMENT字段和InnoDB支持事务。我回滚事务时注意到,AUTO_INCREMENT字段未回滚吗?我发现它是按这种方式设计的,但是有没有解决方法? 问题答案: 让我指出一些非常重要的事情: 您永远不要依赖自动生成键的数字功能。 也就是说,除了将它们的相等性(=)或不相等性(<>)进行比较之外,您不应做任何其他事情。没有关系运算符(<,>),没有
我的项目遇到了Spring JPA事务无法回滚的问题。项目框架为spring MVC+spring+spring data JPA+Oracle。我在网上搜索了很多信息,但仍然不能解决我的问题。 我尝试了许多方法,例如将方法设置为public或在中添加,但仍然无法解决这个问题。 这是我的代码 控制器 服务 刀 我的方法加载我的实现类服务,它编写一个容易出错的1/0。我期望事务在出错后回滚,但它没有
我在Spring Boot应用程序中有一个Javers实现。Mongo4.4被用作数据库。从MongoDB4.4开始,您可以在事务中创建文档。 我在创建对象时模拟了一个异常。如预期的那样,对象没有在数据库中创建,但是一个新的快照被添加到jv_snapshots集合中。 控制器:
我使用的是Spring Boot应用程序,在上面我试图实现事务性管理。但是Spring不会回滚用相同方法保存的数据。 代码库:https://github.com/vinothr/spring-boot-transactional-example