16.savePoint

package test.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;

public class TxTest {
static void update() throws SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
Savepoint sp = null;
try {
String sql1 = "update user1 set money = money - 10 WHERE id=1";
conn = JdbcUtil.getConnection();
conn.setAutoCommit(false);
st = conn.createStatement();
st.executeUpdate(sql1);
sp = conn.setSavepoint();

String sql2 = "select money from user1 where id = 2";
rs = st.executeQuery(sql2);
int money = 0;
while (rs.next()) {
money = rs.getInt("money");
}
if (money > 330) {
throw new RuntimeException("!!!!!!!!!!!!");
}

conn.commit();
} catch (RuntimeException e) {
if (conn != null && sp != null) {
conn.rollback(sp);
conn.commit();
throw e;
}
} catch (SQLException e) {
if (conn != null) {
conn.rollback();
throw e;
}
} finally {
JdbcUtil.free(rs, st, conn);
}
}

public static void main(String[] args) throws SQLException {
update();
}
}
### Navicat 16 中执行回滚操作的方法 在数据库管理工具如 Navicat 16 中,事务管理和回滚是一项重要的功能。当在一个会话中启动了一个显式的事务后,在遇到错误或不期望的结果前,可以通过 `ROLLBACK` 命令撤销所有的更改并恢复到事务开始之前的状态。 对于 MySQL 数据库而言,在 Navicat 16 执行回滚的具体过程如下: #### 启动一个新的查询窗口 打开 Navicat 并连接至目标 MySQL 数据库实例,选择要操作的数据库对象(表),然后开启新的 SQL 编辑器窗口来编写和执行 SQL 语句[^1]。 #### 开始一个新事务 为了确保能够正确地进行回滚测试,先通过 `START TRANSACTION;` 或者 `BEGIN;` 来标记事务起点[^3]。 ```sql START TRANSACTION; ``` #### 设置保存点(可选) 如果想要更精细地控制哪些部分应该被保留而哪些需要取消,则可以在适当的时候创建保存点。这允许只撤消自上次设定以来所做的改变而不影响整个事务链上的其他修改[^2]。 ```sql SAVEPOINT my_savepoint_name; ``` #### 发生异常情况后的处理方式 一旦确认出现了不应该发生的变更或者是程序逻辑上不允许继续前进的情况时,立即发出 `ROLLBACK;` 指令来回退所有未提交的变化;如果是针对特定保存点的话则使用 `ROLLBACK TO SAVEPOINT savepoint_name;` 的形式。 ```sql -- 完全回滚当前事务中的全部改动 ROLLBACK; -- 只回滚到最后一个指定的保存点处 ROLLBACK TO SAVEPOINT my_savepoint_name; ``` #### 提交正常结束的事务 如果没有发生任何问题,并且已经完成了预期的任务,则应当调用 `COMMIT;` 将临时状态永久化存储于持久层之中。 ```sql COMMIT; ``` 需要注意的是,上述提到的功能适用于支持 ACID 属性的关系型数据库管理系统(RDBMS),比如 MySQL 和 Oracle 等。而对于 NoSQL 类型的数据存储解决方案来说,可能并不具备相同级别的事务特性实现[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值