import java.sql.*;
class Btest {
public static void main(String args[]){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore","root","root");
con.setAutoCommit(false);
PreparedStatement pstmt=con.prepareStatement("update test set b=? where a=?");
pstmt.setString(1, "2");
pstmt.setString(2, "1");
pstmt.executeUpdate();
pstmt=con.prepareStatement("select * from test where a=?");
pstmt.setString(1, "1");
ResultSet rs=pstmt.executeQuery();
rs.next();
System.out.println("after update before rollback b="+rs.getString("b"));
con.rollback();
pstmt=con.prepareStatement("select * from test where a=1");
rs=pstmt.executeQuery();
rs.next();
System.out.println("after rolleback before commit b="+rs.getString("b"));
con.commit();
con.rollback();
pstmt=con.prepareStatement("select * from test where a=1");
rs=pstmt.executeQuery();
rs.next();
System.out.println("before rollback after commit b="+rs.getString("b"));
pstmt=con.prepareStatement("select * from test where a=1");
rs=pstmt.executeQuery();
rs.next();
System.out.println("after rolleback b="+rs.getString("b"));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:after update before rollback b=2
after rolleback before commit b=1
before rollback after commit b=1
after rolleback b=1
结论:
1.在commit之前,执行的更新数据库操作是可以影响数据库的,但是可以rollback回来,这时再commit,则已经rollback的语句无法在执行了
2.commit之后,rollback智能回滚到commit处,之前的操作已经“真正”持久化了