MySQL事务之保存点

MySQL事务之保存点

MySQL事务保存点允许将事务划分为多个较小的、更易于管理的部分,并在需要时回滚到事务中的特定点。

如,g_user有以下数据

+----+--------+------+
| id | t_name | age  |
+----+--------+------+
|  1 | user1  |    1 |
|  2 | user2  |    2 |
|  3 | user03 |    3 |
|  4 | user04 |    4 |
|  5 | user05 |    5 |
| 12 | user12 |   12 |
| 13 | user13 |   13 |
| 18 | user18 |   18 |
| 22 | user22 |   22 |
| 23 | user21 |   23 |
+----+--------+------+

执行事务

START TRANSACTION;
select * from tp where id > 2 is not null for update ;
savepoint a;
update tp set age = 20 where id is not null;
rollback to a;
commit ;

再次查询g_user,发现结果和之前一模一样,因为rollback to混滚到了savepoint定义之前的状态,也就是说,savepoint 还原点rollback to 还原点之间的所有sql操作全部不会生效。

⚠️ 注意

  • savepointrollback to 必须搭配使用
  • 如果有需要,可以删除还原点release savepoint还原点

既然有保存点,那么我们在写代码时如何判断是否执行还原呢?这就需要用到MySQL事务了

create procedure Clear_G_USER()
begin
DECLARE row_count int unsigned default 0;
# 开启事务
START TRANSACTION;
    SAVEPOINT a;
    # 统计总数
   SELECT count(id) INTO @row_count from g_user where id is not null;
    # 当表中数据量达到9w,转移表中数据
    if @row_count > 90000 THEN
    	insert into g_user_bak select * from g_user;
        delete from g_user where id is not null;
    else
	    # 如果没有行被更新,则回滚
	    ROLLBACK TO SAVEPOINT a; 
	end if;
    commit;
end;
posted @   勤匠  阅读(33)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示