【问题标题】:The relationship between autocommit in Mysql and AutoCommit in JDBCMysql中的autocommit与JDBC中的AutoCommit的关系
【发布时间】:2021-04-15 08:31:11
【问题描述】:

我的 MySQL 的存储引擎是 InnoDB。当我设置 MySQL 系统变量autocommit=0 时,执行 Java 代码后我看不到数据库中的任何更改:

 String sql = "insert into user (userName, userAge, password) " +
                    "values (?, ?, ?);";
 PreparedStatement preparedStatement = conn.prepareStatement(sql);
 preparedStatement.setString(1, "hh");
 preparedStatement.setInt(2, 33);
 preparedStatement.setString(3, "agadf");
 int i = preparedStatement.executeUpdate();

 conn.close();

或隐式使用commit

 conn.setAutoCommit(false);

 String sql = "insert into user (userName, userAge, password) " +
                    "values (?, ?, ?);";
 PreparedStatement preparedStatement = conn.prepareStatement(sql);
 preparedStatement.setString(1, "hh");
 preparedStatement.setInt(2, 33);
 preparedStatement.setString(3, "agadf");
 int i = preparedStatement.executeUpdate();
 conn.commit();
 conn.setAutoCommit(true);

执行此操作后,执行“select * from user;”时看不到任何更改。但是当我在 MySQL shell 中输入commit 后,insert 操作就起作用了。

所以,我很想知道系统变量autocommit的真正作用。如果我设置为0,在MySQL shell中不执行commit就无法使用JDBC修改数据?

同时我想知道为什么setAutomatic(true)conn.commit()在系统变量autocommit0的情况下不能将更改提交到真实表?

【问题讨论】:

    标签: mysql jdbc


    【解决方案1】:

    您从错误的角度处理此问题,问题不在于 JDBC,而在于您的 MySQL shell。 MySQL shell 也使用事务(数据库中的所有操作都发生在事务中),并且您的 MySQL 配置为 autocommit=0,那么,如果您不在 shell 中提交,shell 将使用其当前看不到的事务您所做的更改,因为该事务是在您进行更改之前开始的。在 MySQL shell 中提交会导致 shell 在您选择之前启动 new 事务,因此它可以看到您在 Java 应用程序中所做的更改。

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 1970-01-01
      • 2013-07-13
      • 2012-06-16
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2015-01-10
      相关资源
      最近更新 更多