MySQL中的回滚点
参考链接:https://www.cnblogs.com/noteless/p/10312824.html
在JDBC中存在着保存点的概念:
public class JdbcExample {
// 直接去lib/META-INF/services下面去拷贝即可
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
// 数据库的用户名与密码
static final String USER = "root";
static final String PASS = "root";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(JDBC_DRIVER);
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 执行查询
System.out.println("实例化Statement对象,即执行SQL语句的对象...");
String sql1 = "delete from tb_user where id = 3";
String sql2 = "delete from tb_user where id = 4";
stmt = conn.createStatement();
conn.setAutoCommit(false);
int i = stmt.executeUpdate(sql1);
Savepoint sql1Savepoint = conn.setSavepoint("sql1Savepoint");
int i1 = stmt.executeUpdate(sql2);
Savepoint sql2SavePoint = conn.setSavepoint("sql2SavePoint");
// 回滚点,表示的回滚到哪个地方,然后提交回滚点的事务;在回滚点下面的代码将不会再来进行执行
// 上面回滚到了sql1的位置上,那么上面的位置上是执行成功了;但是下面的没有来进行执行。
conn.rollback(sql1Savepoint);
// 目标方法执行成功,提交事务
conn.commit();
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} catch (Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
// 否则需要将事务来进行回滚操作
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
回滚点表示的是回滚到哪个回滚点,在这个点之前的SQL都将会执行成功;但是在这个点之后的SQL执行了相当于是没有执行成功。
从理论中来,到实践中去,最终回归理论