当JDBC程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用JDBC提供的事务控制方法。
1.1 常用方法// 查询自动提交的状态。 boolean getAutoCommit(); // 设置自动提交的状态。 void setAutoCommit(boolean autoCommit); // 设置还原点。 Savepoint setSavepoint(); // 设置指定名称的还原点。 Savepoint setSavepoint(String name); // 删除指定名称的还原点。 void releaseSavepoint(Savepoint savepoint); // 提交。 void commit(); // 回滚。 void rollback(); // 回滚到指定名称的还原点。 void rollback(Savepoint savepoint); // 查询隔离级别。 int getTransactionIsolation(); // 设置隔离级别。 void setTransactionIsolation(int level);1.2 使用实例
public static void main(String[] args) {
Properties pros = new Properties();
try {
pros.load(new TestConnection().getClass().getClassLoader().getResourceAsStream("jdbc.properties"));
} catch (IOException e) {
e.printStackTrace();
}
try {
Class.forName(pros.getProperty("driverClass"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
PreparedStatement pstmt = null;
try {
String url = pros.getProperty("url");
String user = pros.getProperty("user");
String password = pros.getProperty("password");
conn = DriverManager.getConnection(url, user, password);
boolean status = conn.getAutoCommit();
System.out.println("AutoCommit = " + status);
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("delete from student where id = 906");
pstmt.executeUpdate();
int e = 1 / 0;// 模拟出现异常
pstmt = conn.prepareStatement("delete from student where id = 907");
pstmt.executeUpdate();
conn.commit();// 手动提交,不能省略
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();// 手动回滚,可以省略,系统会自动回滚
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}



