java jdbc 实现事务回滚的核心在于调用 connection 对象的 rollback() 方法。具体做法是先将自动提交关闭,在 try-catch 块中捕获异常,并在 catch 块中执行回滚操作,确保数据一致性。

如何设置手动提交模式
要实现回滚,必须通过 setAutoCommit(false) 关闭自动提交。这样 SQL 语句不会立即生效,而是暂存在事务缓冲区中,直到显式调用 commit() 或 rollback()。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 关闭自动提交
conn.setAutoCommit(false);
// 模拟业务逻辑
System.out.println("Transaction started");
// 假设这里执行了更新操作
// conn.createStatement().executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
// 模拟异常发生
throw new SQLException("Simulated error");
} catch (SQLException e) {
System.out.println("Error occurred, rolling back...");
// 注意:实际项目中需要在获取连接后处理 rollback
}
}
}如何在异常时触发回滚
在 catch 块中调用 conn.rollback() 可以撤销所有未提交的更改。如果未捕获异常,连接关闭时可能自动回滚,但显式回滚更可靠。
立即学习“Java免费学习笔记(深入)”;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class RollbackExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "password";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
// 模拟业务逻辑
System.out.println("Executing transaction");
// 假设这里执行了更新操作
// conn.createStatement().executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
// 模拟异常发生
throw new SQLException("Simulated error");
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback();
System.out.println("Rollback successful");
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}回滚后连接状态如何变化
回滚后,连接仍处于打开状态,但事务已重置。可以继续使用同一连接执行新的 SQL 语句,但需要重新开启新的事务(即再次调用 setAutoCommit(false) 或依赖默认行为)。


















