【问题标题】:JDBC transactions rollback() still updating table [duplicate]JDBC事务回滚()仍在更新表[重复]
【发布时间】:2017-11-10 18:48:47
【问题描述】:

我有一个包含 id 列、bids 列和 cost 列的表。我在 jdbc 中使用事务。我将自动提交设置为 false,执行了一些查询来更新该表,然后调用回滚方法,该方法应该撤消在事务中所做的更改并将表恢复到之前的状态。但是,该表仍在更新中。

这是我的代码:

public class JdbcTransactions {
public static void main(String[] args) {
    Connection myConn = null;
    Statement myStmt = null;

    try {
        myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/tutorialdatabase", "student", "student");

        myConn.setAutoCommit(false);

        myStmt = myConn.createStatement();
        myStmt.executeUpdate("UPDATE items SET bids = 0 WHERE id <= 5");
        myStmt.executeUpdate("UPDATE items SET cost = cost + 100 WHERE id <= 5");

        myConn.rollback();


    }catch(SQLException e) {
        System.err.println("Something went wrong: ");
        e.printStackTrace();

    } finally {
        try {
            myStmt.close();
            myConn.close();
        }catch(SQLException e) {

        }
    }
}

}

我想更新 tutorialdatabase 中的 items 表,将出价设置为 0,并将前 5 行的成本增加 100(ID 为 1 - 5 的所有行)

【问题讨论】:

  • 您确定在运行代码时没有遇到任何异常吗?
  • 不,根本没有抛出 SQLException。 :(
  • 还有其他例外情况。也许您需要捕获通用异常并查看发生了什么?
  • 您的自动提交也可以在数据库会话级别启用
  • 表的DDL是什么,它们是MyISAM表吗?

标签: java mysql jdbc


【解决方案1】:

尝试在 db 上关闭自动提交 SET 自动提交=0;

【讨论】:

  • 使用 myConn.setAutoCommit(false) 关闭自动提交,您不应该为此使用数据库语句,因为它可能会使驱动程序端连接处于错误状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2019-11-26
  • 1970-01-01
  • 2017-09-30
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多