JAVA在发生异常时,回滚对数据库的操作,同时在数据库中插入一条异常信息。
时间: 2024-09-24 20:05:59 浏览: 57
在Java中,当程序运行过程中发生异常并需要回滚对数据库的操作时,通常会利用`try-catch-finally`结构以及`Connection`、`Statement`或`PreparedStatement`等数据库连接处理类。以下是一个简化的示例:
```java
import java.sql.Connection;
import java.sql.PreparedStatement;
public class DatabaseTransaction {
private Connection connection;
try {
// 获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "username", "password");
// 设置事务开始
connection.setAutoCommit(false);
// 开始尝试执行SQL操作
String sql = "INSERT INTO my_table (data) VALUES (?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "example data");
// 执行可能抛出异常的业务操作,比如数据库查询或更新
// ...
// 如果业务操作成功,提交事务
statement.executeUpdate(); // 或其他操作
connection.commit();
} catch (SQLException e) {
// 发生异常,回滚事务并将异常信息记录到数据库
System.out.println("An error occurred: " + e.getMessage());
try {
rollback(connection); // 自定义的回滚方法
} catch (SQLException ex) {
ex.printStackTrace();
}
// 插入异常日志
insertExceptionLog(e);
} finally {
// 关闭资源,无论是否发生异常
closeQuietly(connection);
}
private void rollback(Connection conn) throws SQLException {
if (conn != null && !conn.isClosed()) {
conn.rollback();
}
}
private void insertExceptionLog(SQLException exception) {
try {
String query = "INSERT INTO exception_log (message, stacktrace) VALUES (?, ?)";
PreparedStatement logStmt = connection.prepareStatement(query);
logStmt.setString(1, exception.getMessage());
logStmt.setString(2, getStackTrace(exception));
logStmt.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
// ... 其他辅助方法 ...
private void closeQuietly(AutoCloseable resource) {
try {
if (resource != null) {
resource.close();
}
} catch (IOException ignore) {}
}
}
```
在这个例子中,如果`executeUpdate()`或类似操作抛出异常,`catch`块会捕获它,并首先回滚事务,然后将异常信息插入到`exception_log`表中。
阅读全文