代码之家  ›  专栏  ›  技术社区  ›  Koray Tugay

即使auto commit为false,从连接中创建新语句是否会提交所有内容?

  •  0
  • Koray Tugay  · 技术社区  · 6 年前

    import java.sql.*;
    
    class App {
        public static void main(String[] args) {
            HelloJdbc hj = new HelloJdbc();
            hj.insertPerson();
            hj.printPersons();
            hj.close();
        }
    }
    
    class HelloJdbc {
    
        String url = "jdbc:h2:~/persons";
        String username = "username";
        String password = "password";
    
        // Active connection
        Connection con;
    
        public HelloJdbc() {
            try {
                Connection con = DriverManager.getConnection(url, username, password); Statement st = con.createStatement();
                // Making sure I have the same data every time
                st.executeUpdate("DELETE FROM person");
                st.executeUpdate("INSERT INTO person VALUES (1, 'Alice');");
                this.con = con;
            } catch (SQLException e) {}
        }
    
        void insertPerson() {
            try {
                con.setAutoCommit(false);
                con.createStatement().executeUpdate("INSERT INTO person VALUES(2, 'Bob');");
            } catch (SQLException e) {}
        }
    
        void printPersons() {
            try (Connection con = DriverManager.getConnection(url, username, password);) {
                ResultSet rs = con.createStatement().executeQuery("SELECT * FROM person;");
                while (rs.next()) {
                    System.out.println(rs.getObject(1) + " " + rs.getObject(2));
                }
            } catch (SQLException e) {}
        }
    
        void close() {
            try {
                con.close();
            } catch (Exception e) {}
        }
    }
    

    运行此代码时,输出为:

    1 Alice
    

    我明白,自从年 insertPerson 我有 con.setAutoCommit(false);

    但是,当我改变 printPerson

    void printPersons() {
        try {
            ResultSet rs = con.createStatement().executeQuery("SELECT * FROM person;");
            while (rs.next()) {
                System.out.println(rs.getObject(1) + " " + rs.getObject(2));
            }
        } catch (SQLException e) {}
    }
    

    输出更改为:

    1 Alice
    2 Bob
    

    我很困惑,从一个连接创建一个新语句是否会提交先前语句的所有内容?行为改变的原因是什么?

    编译运行方式 javac App.java; java -cp ".:h2.jar" App; h2.jar 在同一文件夹中 App.java .

    0 回复  |  直到 6 年前
        1
  •  2
  •   Gord Thompson    6 年前

    如果连接在事务中执行插入、更新或删除,则 相同的连接 将能够看到更改,即使这些更改尚未提交,以便 其他连接

    (实际上,在正常情况下,其他连接在提交更改之前无法看到更改,但是隔离级别为READ_UNCOMMITTED的事务将允许其他连接在原始连接执行提交或回滚之前看到更改。)

    推荐文章