java中jdbc通过setsavepoint创建事务保存点,出错时用rollback(savepoint)局部回滚,保留保存点前操作;需先setautocommit(false),commit或rollback后保存点自动失效。

Java 中用 JDBC 的 Savepoint 实现部分回滚,核心是:在事务中创建保存点,后续出错时只回滚到该保存点,保留其之前的操作,而不是整个事务回滚。
开启事务并创建保存点
默认情况下 JDBC 连接是自动提交(auto-commit)模式,必须先关闭它才能使用保存点:
- 调用
connection.setAutoCommit(false)关闭自动提交 - 执行若干 SQL 操作(如插入、更新)
- 调用
connection.setSavepoint("sp1")创建命名保存点,或用connection.setSavepoint()获取匿名保存点对象
捕获异常后回滚到指定保存点
当某段逻辑失败需局部回滚时,不要调用 rollback()(那会回滚整个事务),而是传入保存点对象:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用
connection.rollback(savepoint)回滚到该保存点,之后的语句被撤销,但保存点前的修改仍有效 - 保存点本身不会自动失效,但回滚后若继续使用它会抛
SQLException,建议回滚后丢弃引用 - 可多次创建和回滚到不同保存点,形成嵌套控制粒度
提交或彻底回滚前清理保存点
保存点是事务内的临时标记,生命周期随事务结束而终止:
- 调用
connection.commit()后,所有保存点自动释放 - 调用无参
connection.rollback()也会清除全部保存点 - 无需手动“删除”保存点,但避免在已回滚过的保存点上再次 rollback
完整示例代码片段
比如向订单表和订单明细表插入数据,明细插入失败时只撤回明细,保留主订单:
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false);
try {
// 插入主订单
executeUpdate(conn, "INSERT INTO orders(id, name) VALUES (?, ?)", 1001, "test");
// 创建保存点
Savepoint sp = conn.setSavepoint("before_details");
// 插入明细(可能失败)
executeUpdate(conn, "INSERT INTO order_items(order_id, item) VALUES (?, ?)", 1001, "item1");
executeUpdate(conn, "INSERT INTO order_items(order_id, item) VALUES (?, ?)", 1001, "item2");
conn.commit();
} catch (SQLException e) {
// 明细出错,只回滚到保存点
conn.rollback(sp);
conn.commit(); // 提交主订单,放弃明细
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










