许多数据库的auto-commit默认是ON的,比如MySQL,PostgresSQL等。当然也有默认是OFF的,比如Oracle(Oracle里面执行DML语句是需要手动commit的)。
这里我们以MySQL为例,先写一个基本的JDBC连接的例子:
package com.mycloud.demo.connection; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class ConncetionTest1 { public static void main(String[] args) { String jdbcUrl = "jdbc:mysql://localhost:3306/test_db"; String username = "xxx"; String password = "xxx"; // Basic sample // Connection -> Statement -> ResultSet: try with resource try (Connection con = DriverManager.getConnection(jdbcUrl, username, password); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select id, account from test")) { String result = getResultSetAsString(rs); System.out.println(result); } catch (SQLException e) { System.out.println(e.getMessage()); } } private static String getResultSetAsString(ResultSet rs) throws SQLException { ResultSetMetaData rsmd = rs.getMetaData(); int numCols = rsmd.getColumnCount(); StringBuilder sb = new StringBuilder(); while (rs.next()) { for (int i = 1; i <= numCols; i++) { String elem = rs.getString(i); if (rs.wasNull()) sb.append("NULL"); else sb.append(elem); if (i != numCols) sb.append("|"); } sb.append(System.lineSeparator()); } return sb.toString(); } }
在auto-commit默认是ON的情况下,每一条sql都是一个独立的事务,运行完直接commit。但是如果需要实现事务,比如我们执行一组DML,如果某一条失败,就全部rollback。这种方式就不行了: