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 @ 2024-09-01 20:24  勤匠  阅读(53)  评论(0)    收藏  举报