JDBC设置了setAutoCommit(false)出错不回滚的坑

本文共有1083个字,页面加载耗时0.001秒,关键词:

设置connection.setAutoCommit(false);之后,在两条操作语句之间故意制造错误,发现不会自动回滚;

    try {
            connection = JDBCUtils.getConnection();
            connection.setAutoCommit(false);
            statement1 = connection.createStatement();
            statement2 = connection.createStatement();
            statement1.executeUpdate("update account set balance = balance - 500 where name = '王五'");
            int a = 5 / 0; // 故意制作错误
            statement2.executeUpdate("update account set balance = balance + 500 where name = '张三'");
            connection.commit();
        } catch (Exception err) {
            try {
                if (connection != null) {
                    System.out.println("rollback");
                    connection.rollback();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println(err.getMessage());
        }

后来发现不是代码的问题,是mysql的表引擎导致的

数据库的引擎如果是innodb, 不执行commit,数据不会更新;如果用的是myisam引擎,因为不支持事务,不执行commit,也会更新数据。

扫码在手机查看