在Java中,使用JDBC进行数据库操作时,如果需要实现事务管理(包括添加失败回滚),可以通过以下步骤来实现:
- 关闭自动提交(
autoCommit)模式。 - 执行数据库操作。
- 如果所有操作都成功,提交事务。
- 如果任何操作失败,回滚事务。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseTransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 1. 加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取数据库连接
connection = DriverManager.getConnection(url, user, password);
// 3. 关闭自动提交模式
connection.setAutoCommit(false);
// 4. 准备SQL语句
String sql = "INSERT INTO mytable (column1, column2) VALUES (?, ?)";
preparedStatement = connection.prepareStatement(sql);
// 5. 设置参数并执行第一个插入操作
preparedStatement.setString(1, "value1");
preparedStatement.setString(2, "value2");
preparedStatement.executeUpdate();
// 6. 模拟第二个插入操作失败
preparedStatement.setString(1, "value3");
preparedStatement.setString(2, "value4");
preparedStatement.executeUpdate();
// 7. 如果所有操作都成功,提交事务
connection.commit();
System.out.println("Transaction committed successfully.");
} catch (ClassNotFoundException e) {
System.err.println("Database driver not found.");
e.printStackTrace();
} catch (SQLException e) {
System.err.println("SQL Exception occurred.");
e.printStackTrace();
// 8. 如果发生异常,回滚事务
if (connection != null) {
try {
connection.rollback();
System.out.println("Transaction rolled back successfully.");
} catch (SQLException ex) {
System.err.println("Rollback failed.");
ex.printStackTrace();
}
}
} finally {
// 9. 关闭资源
try {
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println("Failed to close resources.");
e.printStackTrace();
}
}
}
}- 加载数据库驱动。
- 获取数据库连接。
- 关闭自动提交模式。
- 准备SQL语句。
- 设置参数并执行第一个插入操作。
- 模拟第二个插入操作失败(假设第二个插入操作会导致异常)。
- 如果所有操作都成功,提交事务。
- 如果发生异常,回滚事务。
- 关闭资源。
请根据实际情况修改数据库连接URL、用户名、密码以及SQL语句。
















