java mysql事务回滚
时间: 2025-01-08 12:54:07 浏览: 54
### Java 中实现 MySQL 事务回滚
#### 示例代码
为了展示如何在 Java 应用程序中正确配置并使用 MySQL 的事务机制,下面提供了一个简单的例子:
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TransactionExample {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 建立连接
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "";
conn = DriverManager.getConnection(url, user, password);
// 关闭自动提交模式
conn.setAutoCommit(false);
stmt = conn.createStatement();
// 执行第一个SQL更新语句
int result1 = stmt.executeUpdate("UPDATE accounts SET balance=balance-5 WHERE id=1");
System.out.println("First update executed");
// 故意制造错误场景来触发回滚
if (result1 == 0) throw new SQLException("Update failed or no rows affected.");
// 继续执行第二个SQL更新语句
int result2 = stmt.executeUpdate("UPDATE accounts SET balance=balance+5 WHERE id=2");
System.out.println("Second update executed");
// 正常情况下提交更改
conn.commit();
System.out.println("Transaction committed successfully.");
} catch (SQLException e) {
// 出现异常则回滚所有操作
if (conn != null) {
try {
System.err.print("Exception occurred! Rolling back...");
conn.rollback(); // 发生异常时撤销所有未提交的操作
System.err.println("Done!");
} catch(SQLException excep) {
excep.printStackTrace();
}
}
e.printStackTrace();
} finally {
// 清理资源
try {
if(stmt!=null) stmt.close();
if(conn!=null && !conn.isClosed()) conn.close();
} catch(SQLException e){
e.printStackTrace();
}
}
}
}
```
这段代码展示了如何通过关闭 `auto-commit` 来手动控制事务边界,并且在发生任何异常的时候调用 `rollback()` 方法来回退到最近的一次保存点之前的状态。
#### 常见问题解答
对于嵌套事务的支持,在标准 JDBC API 和大多数关系型数据库管理系统(RDBMS),包括 MySQL,默认并不支持真正的嵌套事务。然而,可以通过设置保存点(Savepoint)的方式来模拟这一行为[^1]。这意味着可以在同一个外部事务内定义多个内部逻辑单元,每个都可以独立决定是否要继续还是回滚至某个特定的保存点而不影响其他部分的工作。
另外需要注意的是,尽管可以利用保存点技术达到一定程度上的“伪嵌套”,但这并不是严格意义上的多层嵌入式事务结构;而且一旦最外层的事务被标记为只读,则不允许再创建新的保存点了[^4]。
阅读全文
相关推荐


















